Расшифровать «отправить» сообщение из WebSocket с Java - PullRequest
2 голосов
/ 15 января 2012

Я пытаюсь написать свой собственный сервер WebSocket.

Я знаю, что для этого есть некоторые фреймворки, но я бы хотел научиться, поэтому я делаю это самостоятельно:)

Мой клиент JavaScript в настоящее время реагирует с onOpen, поэтому я думаю, что рукопожатие допустимо и соединение установлено.

Теперь проблема:

Мой сервер Java использует поток селектора для чтения наКанал.

Если я выполняю *.send("test message") на объекте WebSocket на моем клиенте, мой сервер не может декодировать байтовый массив.

Я не нашел информации об используемой технологии кодирования / декодированияпоэтому я пытался декодировать множество версий.

, например:

new String(Base64.decodeBase64(buffer.array()))

или

Charset set = Charset.forName("UTF-8");
new String(Base64.decodeBase64(set.decode(buffer).toString()))

Сообщение полностью читается из канала в байтовый буфер, поэтомуЯ не думаю, что это проблема.

Кто-нибудь может мне помочь?


хорошо, это сообщение помогает мне отправлять данные Клиенту.Это отлично работает :)Но я не понимаю, как декодировать данные, полученные от Клиента: (

На Клиента я отправляю только одно Письмо

socket.send("x");

Сервер получает 7 байтов ???

ByteBuffer buffer = ByteBuffer.allocate(8192);
int read = client.getInputStream().read(buffer2.array());
System.out.println("read: " + read);

// read: 7

for (int i = 0; i < read; i++) {
  int j = buffer.get(i) & 0xff;
  System.out.println("i: " + i + " => " + j + "=>" + new BigInteger(j + "").toString(2));
}

//i: 0 => 129=>10000001
//i: 1 => 129=>10000001
//i: 2 => 195=>11000011
//i: 3 => 235=>11101011
//i: 4 => 4=>100
//i: 5 => 96=>1100000
//i: 6 => 187=>10111011

Если я сделаю это

secondByte AND 0111 1111

, то результат (i: 1) будет равен "1«Я думаю, это означает, что есть только один байт данных.Тогда зачем читать это 7 ???

1 Ответ

2 голосов
/ 17 января 2012

Что касается вашего второго вопроса - данные от клиента к серверу всегда маскируются , как я также объяснил по ссылке выше. Маски занимают 4 байта.

Итак, длина фактических данных действительно равна 1. Только последние 7 бит второго байта говорят что-то о длине - первый бит нет, поэтому просто отбросьте этот, чтобы получить 000 0001, что 1.

В этом случае байты классифицируются следующим образом:

  • 0, 1 - мета-байты
  • 3, 4, 5, 6 - маски
  • 7 - это данные

Чтобы получить данные, вычислите data XOR masks[data_index MOD 4], то есть 187 XOR 195 в этом случае, то есть 120 - код символа для x.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...