使用socket.io-client连接到URL

时间:2015-02-06 15:32:19

标签: node.js socket.io

我有这个演示设置:

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

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

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

    将任何请求重定向到/ 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/的路径丢失了。

如何告诉socket.io-client它应该连接到/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连接   /用户。

有关此问题的解决方法吗?



羞辱我。 RTFM / RTFC的经典案例(代码为C):

SOLUTION:

使用正确的路径:

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

使用正确的nginx配置:

proxy_pass http://localhost:8001/;

这个小尾随/有所不同。

2 个答案:

答案 0 :(得分:0)

在/etc/nginx/nginx.conf中设置位置

location /wstest1 {
    proxy_pass http://localhost:8001;
}

location /wstest2 {
    proxy_pass http://localhost:8002;
}

查看更多: http://nginx.org/en/docs/http/ngx_http_core_module.html#location

答案 1 :(得分:0)

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

  

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

如果您希望将socket.io端点托管在' / wstest1'或者' / wstest2'简单地将其作为“路径”传递出去。创建服务器时的参数。