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 和 socket.io 通过 WebSockets 流式传输 MP3 数据?
带有 Node.js/Socket.IO 服务器和客户端的 Phonegap 应用程序中的 Android 的 WebSockets