使用带有多个模块的 socket.io 客户端

Posted

技术标签:

【中文标题】使用带有多个模块的 socket.io 客户端【英文标题】:Using socket.io client with mutliple modules 【发布时间】:2022-01-20 18:27:35 【问题描述】:

我有多个 html 文件,它们每个都有关联的 js 文件,主要用于 DOM 操作和 socket.io 功能。但是,我不知道如何为这些不同的 javascript 文件使用相同的 socket.id。我也许可以将这些 js 文件合并为一个,但那将是一种倒退。

我尝试制作一个js模块socket.js:

import  io  from 'https://cdn.socket.io/4.3.2/socket.io.esm.min.js';
export const socket = io()

然后将其导入到我的 js 文件中,但我很快意识到这不起作用。

【问题讨论】:

什么不起作用? 文件之间的socket不同,尤其是socket.id 将所有与socket.io相关的代码放在一个文件中,一次加载该文件。我还建议研究一个前端框架,比如 react 来构建比简单信息板更复杂的网站 每个新网页都会创建一个新的 webSocket 连接——这些连接无法在浏览器中更改页面后继续存在——这与您的客户端模块策略无关——它只是浏览器的方式作品。因此,当页面加载并且该页面连接到您的服务器时,每个页面都会有不同的socket.id。您可能需要某种服务器端会话,以便您可以识别哪个用户是哪个用户 - 无论它是哪个 socket.id 并可能跟踪当前的socket.id 【参考方案1】:

我今天也在尝试同样的事情,遇到了你的问题。我的解决方案是这样的:

main.js 在每次页面加载时加载。 一个 IIFE 运行,它通过socket.on('connect', ()=>) 在我的发射器文件中使用套接字设置一个变量 它还只是运行一个包含所有socket.on(msg,()=>) 的函数,传递套接字。

我可以将我所有的套接字消息函数放入emitters.js。并将所有收到的消息放入 received.js

我还没有发现任何问题,但我不确定这是否是标准做法。我找不到关于这个确切问题的太多信息,所以希望这会有所帮助。

main.js

import socketEmitters from './emitters';
import socketRoutes from './socketRoutes';

(function () 
  const socket = io();

  socketReceived(socket);

  socket.on('connect', () => 
    socketEmitters().getSocketInstance(socket);
  );
());

发射器.js

let socket = null;
    
export default function socketEmitters() 

  return 
    emitBtnEvent(toggle, msg) 
      socket.emit(msg, true);
    ,

    getSocketInstance(socketReceived) 
      socket = socketReceived;
    

  ;

received.js

export default function socketRoutes(socket) 

  socket.on('receivedMsg', () => ...);


【讨论】:

以上是关于使用带有多个模块的 socket.io 客户端的主要内容,如果未能解决你的问题,请参考以下文章

如何在 node.js 中接收 socket.io 客户端事件?

如何通过 ES6 模块使用 Socket.IO 客户端?

带有 Node.js 的 Socket.io

带有 iOS 的 Socket.io 未在移动客户端上连接

如何使用 socket.io 实现长轮询?

Kubernetes 中的 Socket.IO 集群,多个节点未发送给所有客户端