Правильное чтение пакетов сокетов с сервера чата Sb0t с Java - PullRequest
1 голос
/ 03 августа 2020

Мой вопрос о Java. Я пытаюсь получить пакет под названием MSG_CHAT_SERVER_PUBLI C с сервера чата. Этот пакет содержит имя пользователя и сообщение, которое он отправляет. Протокол находится в этом списке протоколов: http://uruguayos-xtremos2011.blogspot.com/p/ares-protocol-aresnuevo.html?m=1 В методе Publi c вы можете увидеть, как сервер формирует пакет: https://github.com/AresChat/sb0t/blob/128b2755cdfedaf498d66fbcdf9fda010f4d3087/core/TCPOutbound.cs

В методе обслуживания вы можете увидеть, как клиент чата получает пакеты: https://github.com/AresChat/cb0t/blob/master/cb0t/RoomPanel/AresSocket.cs В методе Eval_Publi c вы можете увидеть, как пакет читается в клиенте чата: https://github.com/AresChat/cb0t/blob/master/cb0t/RoomPanel/Room.Handler.cs

У меня есть следующий код (но в EditText не отображается пакет для чтения; я ожидаю обратного):

InputStream in = sock.getInputStream();

                        while (sock.isConnected()) {

                            //  get message length, first 2 bytes
                            byte[] lengthBytes = new byte[2];
                            in.read(lengthBytes);
                            // convert to int
                            int messageLength = lengthBytes[0] << 8 | lengthBytes[1];


                            // get the protocol byte
                            int procotol = in.read();

                            // get message, length bytes
                            byte[] messageBytes = new byte[messageLength];
                            s.chat.append(Integer.toString(in.read(messageBytes)));


                            // separate message, first x bytes are username
                            int length = 0;

                            // get username length
                            for (byte messageByte : messageBytes) {
                                if (messageByte == 0) break;
                                length++;
                            }

                            // extract username
                            byte[] username = new byte[length];
                            System.arraycopy(messageBytes, 0, username, 0, length);

                            int pos = length + 1;

                            // message length
                            length = messageBytes.length - pos;


                            // extract message
                            byte[] message = new byte[length];
                            System.arraycopy(messageBytes, pos, message, 0, length);

                            s.chat.append("message length: " + messageLength + "\nprocotol: " + procotol + "\nusername: " + new String(username) + "\nmessage: " + new String(message));


                        }

Возможно, вам будет легче, если я скажу вы то, что я сделал до сих пор: https://1drv.ms/u/s! An2GIBqaxDQCgTZ_PCnapHpoRjny

Заранее спасибо за вашу помощь

...