使用特定的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; }