5

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

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

客户端代码:

<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

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

谢谢,丹

4

6 回答 6

3

您可以使用 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>
于 2010-11-26T11:40:30.113 回答
2

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

nginx 可以用作后端 websocket 服务器的反向代理吗?

于 2010-11-05T22:09:33.190 回答
2

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

于 2010-11-10T18:14:20.897 回答
0

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

于 2010-08-11T14:13:39.557 回答
0

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

HTTP/1.1 101 Web 套接字协议握手

升级:WebSocket

连接:升级”

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

于 2010-08-13T01:45:14.363 回答
-3

很确定方法名称是“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');
});
于 2010-08-11T21:42:46.370 回答