使用特定的path和命名空间连接到Socket.IO服务器

我的Node.js应用程序运行在URL http://www.example.com/myapp/ 。

我已经configuration了一个Socket.IO服务器(版本1.3.5)与一个自定义命名空间。 以下是一个示例代码片段:

var server = http.createServer(...); var io = socketio(server); io .of('/a/b/c') .on('connection', function (socket) { socket.emit('update', {msg: '/a/b/c'}); }); 

我无法弄清楚如何从客户端连接到这个服务。 我的猜测(这些都没有工作):

 io.connect('http://www.example.com/myapp/a/b/c'); io.connect('http://www.example.com', {path: '/myapp/a/b/c'}); io.connect('', {path: '/myapp/a/b/c'}); io.connect('http://www.example.com/a/b/c', {path: '/myapp'}); io.connect('http://www.example.com', {path: '/myapp/socket.io/a/b/c'}); 

在您的服务器上,不要忘记指定path:

 var io = require('socket.io')(http, { path: '/myapp/socket.io'}); io .of('/my-namespace') .on('connection', function(socket){ console.log('a user connected with id %s', socket.id); socket.on('my-message', function (data) { io.of('my-namespace').emit('my-message', data); // or socket.emit(...) console.log('broadcasting my-message', data); }); }); 

在你的客户端上,不要混淆命名空间和path:

 var socket = io('http://www.example.com/my-namespace', { path: '/myapp/socket.io'}); 

我也使用了1.3.5,与Angular单页面应用程序略有类似,其中socket.io的客户端代码仅与应用程序的其余部分(来自bower包)连接,而不是下载/包括从一个特定的networking位置。

什么似乎在我的socket.io在设置的工作:

 http://somedomain.com:9096/sockets/socket.io.js 

而不是默认的:

 http://somedomain.com:9096/socket.io/socket.io.js 

(我手动调整了服务器端的path),是:

 io.connect('http://somedomain.com:9096' + '/' + namespaceName, { path: '/sockets' }); 

它看起来相当于你的场景:

 io.connect('http://www.example.com/a/b/c', {path: '/myapp'}); 

这可能值得再试一次。 我还没有完全testing在其中的正斜杠namespaceName ,但似乎拿起客户端的连接,当我只是改变我的命名空间为'/a/b/c'

可能有什么不同是我的服务器端设置,这是:

 var server = http.createServer(app); var io = require('socket.io')(server, { path: '/sockets' }).listen(server); 

我的答案更多的是一个普遍的迹象,即使设置不明显,也可以同时使用命名空间和自定义path。 我希望在某种程度上对你有用。

您可以查看Rooms和Namespaces上的官方文档。 基本上,关于socket.io是,一旦你的客户端请求客户端源,它将传输客户端连接到服务器(主机,path,端口等)所需的所有必要的细节。

要连接到特定的命名空间,您只需在客户端上指定:

 var socket = io('/a/b/c'); 
 location ~* /path/some/socket.io/ { tcp_nodelay on; add_header 'Access-Control-Allow-Origin' "https://domain.at/" always; rewrite /(.*) /socket.io/ break; proxy_pass http://10.5.5.10:3000; }