使用特定路径和命名空间连接到 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:命名空间、通道和合作

Socket.io-client 未连接到 socket.io 服务器反应和节点(快递)

Socket.io 通过 id 获取套接字不起作用

Swift iOS 应用程序不使用 Socket.IO 连接到服务器

如何使用 python 连接到 socket.io