Socket.io客户端:始终无效的命名空间消息

7

服务器代码:

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控制台中没有任何消息。

在浏览器的网络选项卡中,有很多连接并显示以下类似信息:

在此输入图片描述

1个回答

21
将客户端代码更改为以下内容:
const 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设计中令人困惑的部分,但是path和命名空间并不是socket.io中的同一概念。请不要混淆或混合使用它们。


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

@user1356144 - 请提出一个新问题,解释您的代理情况并展示所有相关代码。 - jfriend00
io 是从哪里导入的? - Santosh
1
@Santosh - 这在socket.io文档中有详细说明。你可以从/socket.io/socket.io.js导入它,它将自动从你的服务器提供,或者你也可以从你喜欢的CDN导入。 - jfriend00
谢谢。这让我头疼了3个小时的问题得到解决。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接