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

gui*_*man 27 javascript node.js socket.io

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

我已经配置了一个带有自定义命名空间的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'});
    });
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何从客户端连接到此服务.我的猜测(这些都不起作用):

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'});
Run Code Online (Sandbox Code Playgroud)

小智 60

在您的服务器上,不要忘记也指定路径:

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);
    });
});
Run Code Online (Sandbox Code Playgroud)

在您的客户端上,不要混淆名称空间和路径:

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


小智 7

我在一个Angular单页面应用程序中也使用1.3.5,在一个稍微类似的场景中,socket.io的客户端代码只是与应用程序的其余部分(来自bower包)连接,而不是下载/包含在特定的网络位置.

在我的socket.io所在的设置中,似乎对我有用的是:

http://somedomain.com:9096/sockets/socket.io.js
Run Code Online (Sandbox Code Playgroud)

而不是默认值:

http://somedomain.com:9096/socket.io/socket.io.js
Run Code Online (Sandbox Code Playgroud)

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

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

它看起来与您的场景相同:

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

这可能值得再试一次.我还没有完全测试namespaceName其中的正斜杠,但它似乎在客户端获取连接,当我只是将我的命名空间更改为'/a/b/c'

可能与众不同的是我的服务器端设置,其中包括:

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

我的回答更多的是一般性的指示,即尽管设置不明显,但可以同时使用命名空间和自定义路径.我希望它在某种程度上对你有用.


Fil*_*vić 1

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

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

var socket = io('/a/b/c');
Run Code Online (Sandbox Code Playgroud)

  • 显然它不起作用。它将尝试连接到类似“http://www.example.com/socket.io/?EIO=3&transport=polling&t=1428495850033-1”的内容,这当然会返回“404 Not Found”。 (4认同)
  • 我还应该注意到,如果我配置没有命名空间的 Socket.IO 服务器,即没有 `.of('/a/b/c')` 内容,以下客户端代码将按预期工作: `io.connect( '' , {path: '/myapp/socket.io'})`。 (4认同)