Node.js Websockets Socket.IO - PullRequest
       11

Node.js Websockets Socket.IO

5 голосов
/ 11 августа 2010

Я не могу инициировать события на стороне клиента, см. Код / объяснение:

Ладно, у меня все получилось (я думаю)

Код на стороне клиента:

<script src="./Socket.IO/socket.io.js"></script>
<script>
    io.setPath('./Socket.IO/');

    var socket = new io.Socket('jayz.danstanhope.webfactional.com', { 'port': 80 });

    socket.on('connect', function () {
        alert('connect');
    });
    socket.on('message', function (msg) {
        alert('message' + msg);
    });
    socket.on('close', function () {
        alert('close');
    });
    socket.on('disconnect', function () {
        alert('disconnect');
    });
    socket.connect();

</script>

Код на стороне сервера:

var sys = require("sys")
  , fs = require("fs")
  , path = require("path")
  , http = require("http");
var io = require('/home/danstanhope/webapps/htdocs/Socket.IO-node');

var server = http.createServer(function (req, res) {
    //your normal server code
    res.writeHead(200, { 'Content-Type': 'text/html' });
    res.write('Hello world');
    res.end();
});

server.listen(26970);
server = io.listen(server);
server.on('connection', function(client){
    sys.log('client connected');
});

Когда я обновляю страницу в Chrome, я вижу записи логов в Shell.

Вот что я вижу:

danstanhope@web146 htdocs]$ node server.js
9 Aug 19:19:37 - socket.io ready - accepting connections
9 Aug 19:19:40 - Initializing client with transport "websocket"
9 Aug 19:19:40 - Client 21789167495444417 connected
9 Aug 19:19:40 - client connected
9 Aug 19:19:40 - Client 21789167495444417 disconnected

Единственная проблема теперь - это запуск любого из этих предупреждений сокетов javascript.

Кроме того, эта ошибка отображается в Chrome:

Bad Upgrade header: Server: nginx

Date: Wed, 11 Aug 2010 23:06:06 GMT

Transfer-Encoding: chunked

Connection: keep-alive

Upgrade: WebSocket

Есть идеи, как исправить "плохой заголовок"?

Спасибо, Дэн

Ответы [ 6 ]

3 голосов
/ 26 ноября 2010

Вы можете проксировать стандартные запросы HTML с помощью nginx, но не через веб-сокеты или соединение flashsockets, поскольку nginx пока не может пересылать трафик не HTTP 1.0 через прокси. Таким образом, веб-сокеты не нужны, и Flash не сможет отправить свою междоменную политику, так как она выглядит примерно так:

<policy-file-request/>\x00

Какой nginx с радостью выдает ошибку HTTP 400.

Чтобы заставить его работать, вы должны подключить клиент к порту, который прослушивает приложение вашего node.js:

<script src="./Socket.IO/socket.io.js"></script>
<script>
    io.setPath('./Socket.IO/');

    var socket = new io.Socket('jayz.danstanhope.webfactional.com', { 'port': 26970 });

    socket.on('connect', function () {
        alert('connect');
    });
    socket.on('message', function (msg) {
        alert('message' + msg);
    });
    socket.on('close', function () {
        alert('close');
    });
    socket.on('disconnect', function () {
        alert('disconnect');
    });
    socket.connect();

</script>
2 голосов
/ 10 ноября 2010

Некоторое время назад у меня возникла точно такая же проблема, и проблема была вызвана двумя разными версиями socket.io.Я использовал npm для импорта одной версии, затем получил версию на стороне клиента на github от другого разработчика, и они были несовместимы.Дважды проверьте, что вы случайно не используете чужую вилку.

2 голосов
/ 06 ноября 2010

На данный момент невозможно использовать веб-сокеты с машины nginx.Возможно, это было недавно исправлено, но все мои исследования говорят о том, что nginx и Apache в настоящее время не могут размещать веб-сокеты.Кажется, что большинство обратных прокси не согласны с веб-сокетами.

Можно ли использовать nginx в качестве обратного прокси-сервера для внутреннего сервера веб-сокетов?

0 голосов
/ 13 августа 2010

"Начиная с http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol-75,, который используется в Chrome 4 и 5, заголовок ответа должен начинаться с:

HTTP / 1.1 101 рукопожатие протокола веб-сокетов

Обновление: WebSocket

Connection: Upgrade "

Сделал быстрый поиск в Google, и это то, что я придумал.

0 голосов
/ 12 августа 2010

Я уверен, что имя метода - "addEvent", а не "on", хотя "on" определенно будет больше "node-y":)

socket.addEvent('connect', function () {
    alert('connect');
});
socket.addEvent('message', function (msg) {
    alert('message' + msg);
});
socket.addEvent('close', function () {
    alert('close');
});
socket.addEvent('disconnect', function () {
    alert('disconnect');
});
0 голосов
/ 11 августа 2010

Совершенно не имея представления о веб-сокетах, но в коде клиента вы инициализируете сокет с портом 80, но говорите серверу прослушивать порт 26970.

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