使用socket.io-client连接到URL

4
我有一个演示设置:
  • node.js WebSocket服务器#1(使用'socket.io')运行在端口8001上

  • node.js WebSocket服务器#2(使用'socket.io')运行在端口8002上

  • nginx websocket反向代理运行在端口8000上:

    重定向任何请求到/wstest1/到端口8001(服务器#1) 重定向任何请求到/wstest2/到端口8002(服务器#2)

一个node.js客户端(使用'socket.io-client',而不是浏览器JavaScript客户端)试图连接到服务器#1:

var socket = require('socket.io-client')('ws://localhost:8000/wstest1/');

但它无法连接。Nginx日志显示:
127.0.0.1 - - [06/Feb/2015:16:16:04 +0100] "GET /socket.io/?EIO=3&transport=polling&t=1423235764132-1&b64=1 HTTP/1.1" 404 168 "-" "node-XMLHttpRequest"

所以某处丢失了到/wstest1/的路径。

/wstest1/

nginx设置:

http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }

    server {
        listen 8000;
        location /wstest1/ {
            proxy_pass http://localhost:8001;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }
        location /wstest2/ {
            proxy_pass http://localhost:8002;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }

    }
}

更新:我刚刚发现了这个很好的解释(socket.io/docs/client-api/),为什么它不起作用:

返回指定路径名字空间的Socket实例,如果没有指定则默认返回“/”。例如,如果URL是http://localhost/users,则会建立一个传输连接到http://localhost,并建立一个Socket.IO连接到/users。

有什么解决方法吗?



可耻的我。典型的RTFM / RTFC(C代表代码)案例:

解决方案:

使用正确的路径:

var socket = require('socket.io-client')('ws://localhost:8000', {path: '/wstest1/socket.io'});

使用正确的nginx配置:

proxy_pass http://localhost:8001/;

这个小小的斜杠/有很大的区别。
2个回答

0

我已经设置了位置。当我将位置设置为“/”时,它可以工作。但是我想在同一端口上运行多个WebSocket服务器。 - pjp
我能看到你的Nginx服务器设置吗? - siavolt

0

请参阅http://socket.io/docs/rooms-and-namespaces/文档。

重要提示:命名空间是Socket.IO协议的实现细节,与底层传输的实际URL无关,默认为/socket.io/…。

如果您希望将socket.io端点托管在“/wstest1”或“/wstest2”,只需在创建服务器时将其作为“path”参数传递即可。


很遗憾,node.js的socket.io-client忽略了{path:...}选项。 - pjp
哦,它确实支持 {path: ...} 选项。请参见 OP 中的解决方案。 - pjp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接