使用特定路径和命名空间连接到 Socket.IO 服务器
Posted
技术标签:
【中文标题】使用特定路径和命名空间连接到 Socket.IO 服务器【英文标题】:Connect to Socket.IO server with specific path and namespace 【发布时间】:2015-06-13 05:16:08 【问题描述】:我的 Node.js 应用程序正在 URL http://www.example.com/myapp/ 处运行。
我已经配置了一个带有自定义命名空间的 Socket.IO 服务器(版本 1.3.5)。这是一个示例代码sn-p:
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');
【问题讨论】:
【参考方案1】:在您的服务器上,不要忘记指定路径:
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);
);
);
在您的客户端上,不要混淆命名空间和路径:
var socket = io('http://www.example.com/my-namespace', path: '/myapp/socket.io');
【讨论】:
Web 客户端对我来说就足够了: var socket = io( path: '/myapp/socket.io');在我使用的反应原生项目中: var socket = io.connect(url, path: path, transports: ['websocket']); 如何使用 path 向特定的套接字 id 发送消息? .我实现了相同的,但套接字向同一个用户发出所有响应【参考方案2】:我也在使用 1.3.5,在一个稍微类似的场景中,来自一个 Angular 单页应用程序,其中 socket.io 的客户端代码只是与应用程序的其余部分(来自一个 bower 包)连接,而不是比从特定网络位置下载/包含。
在我的 socket.io 所在的设置中似乎对我有用:
http://somedomain.com:9096/sockets/socket.io.js
而不是默认:
http://somedomain.com:9096/socket.io/socket.io.js
(我在服务器端手动调整了路径),是:
io.connect('http://somedomain.com:9096' + '/' + namespaceName, path: '/sockets' );
它看起来等同于您的场景:
io.connect('http://www.example.com/a/b/c', path: '/myapp');
这可能值得再试一次。我还没有完全测试带有正斜杠的namespaceName
,但是当我将命名空间更改为'/a/b/c'
可能会有所不同的是我的服务器端设置:
var server = http.createServer(app);
var io = require('socket.io')(server, path: '/sockets' ).listen(server);
我的回答更像是一个一般性的指示,即可以同时使用命名空间和自定义路径,尽管设置并不明显。我希望它在某种程度上对你有用。
【讨论】:
【参考方案3】:您可以在Rooms and Namespaces 上查看官方文档。基本上,socket.io
的优点在于,一旦您的客户端请求客户端源,它将传输客户端连接到服务器所需的所有必要细节(主机、路径、端口等)。
要连接到您的特定命名空间,您只需在客户端上指定:
var socket = io('/a/b/c');
【讨论】:
显然它不起作用。它会尝试连接到http://www.example.com/socket.io/?EIO=3&transport=polling&t=1428495850033-1
之类的东西,当然会返回404 Not Found
。
看起来您的 HTTP 服务器配置正确,并且您能够成功地从 socket.io
服务器处理程序获取 socket.io.js
客户端源。好吧,这很奇怪,它不起作用。我得找点时间做一个快速的本地设置,看看我的情况如何。
我还应该注意,如果我在没有命名空间的情况下配置 Socket.IO 服务器,即没有 .of('/a/b/c')
的东西,以下客户端代码将按预期工作:io.connect('' , path: '/myapp/socket.io')
。
@guidoman 您好,您找到解决问题的方法了吗?我遇到了与您上述相同的行为。以上是关于使用特定路径和命名空间连接到 Socket.IO 服务器的主要内容,如果未能解决你的问题,请参考以下文章
Socket.io-client 未连接到 socket.io 服务器反应和节点(快递)