Node.js сервер WebSocket не получает правильные данные из Chrome - PullRequest
1 голос
/ 23 августа 2011

Я, должно быть, упускаю что-то чрезвычайно очевидное, но не могу правильно выполнить эту работу.

Рукопожатие идет правильно, но как только я отправляю часть данных, я не получаю правильные данные на сервере.

Сервер:

stream.on("data", function(data) {
    if(!handshake) return doHandshake(); // no problems with handshake
    console.log(data);
});

Клиент:

ws = new WebSocket("ws://localhost:12345");
ws.onopen = function() {
    ws.send(String.fromCharCode(parseInt("89", 16)));
}

Что я вижу в консоли node.js:

<Buffer 81 82 ed 68 ae 67 2f e1>

Значит, ключи ed 68 ae 67, а закодированные данные - 2f e1. При использовании xor-декодирования декодированные данные выглядят как c2 89. c2 был получен по неизвестной причине - 89 правильный.

Странные вещи случаются и с другими персонажами:

ws.send(String.fromCharCode(parseInt("ab", 16)));

Я получаю:

<Buffer 81 82 ff 8e 45 34 3d 25>

Декодированные данные c2 ab вместо ab.

Я использую новый формат кадрирования (Chrome 15) и версию узла для Windows (node.exe).

  • Что здесь не так?
  • Можно ли посмотреть, что отправляет Chrome, чтобы увидеть, в чем проблема?

Ответы [ 3 ]

4 голосов
/ 23 августа 2011

Попробуйте с Chrome 13 (текущий стабильный канал).

Chrome 14+ использует более новую версию спецификации веб-сокетов, которая может быть не реализована на сервере веб-сокетов узла версии.

Для получения дополнительной информации см. старую версию спецификации и http://chromestatus.com.

Кроме того, текущие версии Chrome, даже те, которые реализуют новую спецификацию (в настоящее время Chrome 14 и 15), не позволяют отправлять двоичные данные.

1 голос
/ 25 сентября 2011

Я использую Chrome 14.0.835.186 на MacOS X. Только что возникла проблема с разрывом приложения из-за изменений WebSockets в Chrome.

Я переключился на: https://github.com/Worlize/WebSocket-Node

КакАвтор говорит:

ПРЕДУПРЕЖДЕНИЕ. Это библиотека, реализующая только самый последний вариант протокола WebSocket.Он не будет работать с производственными браузерами до тех пор, пока не будут выпущены новые версии, которые его поддерживают.

Это внутреннее приложение, поэтому я могу позволить себе использовать Chrome 14, но есть возможность поддерживать другие.черновики https://gist.github.com/1219165. Я также использую только простой текст.

1 голос
/ 23 августа 2011

Оказалось, что он конвертирует все в UTF-8.

Согласно Википедии , все между 127 и 2047 (база 10) будет кодироваться как два байта:

110bbbaa  10aaaaaa

Например, 89:

base 16 - 89
base 10 - 137
base 2  - 10001001    so bbb = 000, aaaaaaaa = 10001001

Это больше 127 в базе 10. Таким образом, оно будет закодировано как:

110bbbaa  10aaaaaa
11000010  10001001

в базе16:

c2 89

Разочарование было, но, по крайней мере, теперь я знаю, в чем проблема ...

...