【问题标题】:Socket.io Client: Always invalid namespace messageSocket.io 客户端:总是无效的命名空间消息
【发布时间】:2021-03-15 22:31:57
【问题描述】:

服务器代码:

import http from 'http';
import Koa from 'koa';
import { Server } from 'socket.io';


(async () => {
  const app = new Koa();
  var server = http.createServer(app.callback());
  var io = new Server(server, {
    path: '/seacher',
    transports: ['websocket'],
  });

  io.on('connection', (socket) => {
    setTimeout(() => socket.emit('message', { say: 'hello' }), 1000);

    socket.on('message', (msg) => {
      console.log('[msg]', msg);
    });
  });

  server.listen(3000)
})();

客户端代码:

var socket = io('http://localhost:3000/seacher', {
  path: '/seacher',
  autoConnect: false,
  transports: ['websocket'],
});
socket.on('error', (err) => console.log('error', err));
socket.on('connect', () => console.log('connect'));
socket.connect();

浏览器/nodejs 控制台中没有任何消息。

在浏览器的“网络”选项卡中,有很多与类似消息的连接

【问题讨论】:

    标签: node.js typescript socket.io koa


    【解决方案1】:

    把客户端代码改成这样:

    var socket = io('http://localhost:3000', {     // note changed URL here
      path: '/seacher',
      autoConnect: false,
      transports: ['websocket'],
    });
    

    path 选项指定 socket.io 将在内部使用的 URL。你把它放在path 选项中,就像你在客户端和服务器中所做的那样。

    如果您在指定的 URL 中添加了一些内容,就像您使用 'http://localhost:3000/seacher' 一样,那么这就是您尝试连接的命名空间 /seacher,但您的服务器不支持该命名空间。

    这是 socket.io 设计中令人困惑的部分,但在 socket.io 中路径和命名空间不是一回事。不要混淆或混合它们。


    仅供参考,除非您尝试运行多个在同一个 http 服务器上共享的 socket.io 服务器,否则很少有理由像您所做的那样自定义 path 选项(您似乎没有这样做)。默认情况下,路径是/socket.io,这在日志和调试器以及访问客户端库时很有意义。我建议你从客户端和服务器中删除path 选项,让它默认为/socket.io。而且,也不要在连接 URL 中使用路径,因为它指定了命名空间,而不是路径。

    【讨论】:

    • @user1356144 - 请提出一个新问题,解释您的代理情况并显示所有相关代码。
    • io 是从哪里导入的?
    • @Santosh - 在 socket.io 文档中有解释。您可以从 /socket.io/socket.io.js 导入它,它会自动从您的服务器提供,或者您可以从您喜欢的 CDN 导入它。
    猜你喜欢
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 2014-01-20
    • 2013-02-21
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    相关资源
    最近更新 更多