Node.js Websockets Socket.IO

Posted

技术标签:

【中文标题】Node.js Websockets Socket.IO【英文标题】: 【发布时间】:2011-03-28 09:52:10 【问题描述】:

我无法触发客户端事件,请查看代码/说明:

好的,所以我得到了这个工作(我想)

客户端代码:

<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

关于如何修复“坏标题”的任何想法?

谢谢,丹

【问题讨论】:

【参考方案1】:

根本不知道 websockets,但是在客户端代码中,您使用端口 80 初始化套接字,但您告诉服务器在端口 26970 处进行侦听。

【讨论】:

嘿,那是因为我将端口转发到 26970。所以我认为这会很好。不过还是谢谢:)【参考方案2】:

很确定方法名称是“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');
);

【讨论】:

非常感谢您的回复,虽然没有解决它:(同样的问题,事件没有触发。【参考方案3】:

“截至https://datatracker.ietf.org/doc/html/draft-hixie-thewebsocketprotocol-75,其中 在 Chrome 4 和 5 中使用, 响应头必须以 :

开头

HTTP/1.1 101 Web Socket 协议握手

升级:WebSocket

连接:升级”

做了一个快速的谷歌搜索,这就是我想出的。

【讨论】:

【参考方案4】:

目前,无法从 nginx 机器上利用 websocket。这可能最近已得到纠正,但我所有的研究都表明 nginx 和 Apache 目前无法托管 websocket。似乎大多数反向代理不同意 websockets。

Can nginx be used as a reverse proxy for a backend websocket server?

【讨论】:

【参考方案5】:

前段时间我遇到了同样的问题,问题最终是由两个不同版本的 socket.io 引起的。我使用 npm 导入了一个版本,然后在 github 上从另一个开发人员那里获得了客户端版本,它们不兼容。仔细检查您是否无意中使用了别人的叉子。

【讨论】:

【参考方案6】:

您可以使用 nginx 代理标准 HTML 请求,但不能使用 websockets 或 flashsockets 连接,因为 nginx 无法通过代理转发非 HTTP 1.0 流量。 所以 websockets 是不行的,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>

【讨论】:

以上是关于Node.js Websockets Socket.IO的主要内容,如果未能解决你的问题,请参考以下文章

使用 node.js、websockets 和 socket.io 创建实时聊天

仅使用 websockets 构建整个站点(通过 socket.io 和 node.js,没有 Ajax)?

Node Js 和 websockets

如何使用 node.js 和 socket.io 通过 WebSockets 流式传输 MP3 数据?

带有 Node.js/Socket.IO 服务器和客户端的 Phonegap 应用程序中的 Android 的 WebSockets

如何使用 websockets 连接两个 node.js 服务器?