egg.socket.io实现私聊功能的一个问题
发布于 5 年前 作者 tingtingtinghuang 3742 次浏览 来自 问答

很抱歉打扰一下大家,我最近在使用egg socket去实现一个私聊功能。 查了很多网上的做法,普遍的做法是使用一个全局的变量,将每次客户端连接的socket对象保存起来。等到客户端需要发送消息的时候,再将socket对象取出发送消息。 但是现在我有几个问题: 1.egg是没有全局变量的,因为生产环境可能有多个实例,所以每个实例的全局变量不同。所以我不能单纯地将socket挂在app上。 2.想使用redis去存储socket对象。但是socket存入后会变为字符串,无法重新转变为socket对象。 由于这两个问题,导致我不知道怎么实现私聊功能。。 或者egg有其他socket插件可以使用? 跪求指点!(由于不想在egg的issue里发,所以发到这里试下

8 回复

socket.io好像直接通过,io.sockets.clients();就可以访问到socket实例了。egg封装之后不知道在哪里可以访问到。

我正在尝试使用socket.io-redis去达到我的目的 :)

你要实现 通知另外一个实例上的 socket,应该要用接口转发消息了吧.

你的消息会存在数据库吗,如果存的话用轮询方式 去查出本地 socket 上所有的用户的待发消息,然后发送.

@abiuDoIT 原理可能差不多,但是应该不用自己实现这个过程。消息会存在数据库。 用轮询方式 去查出本地 socket 上所有的用户的待发消息,然后发送. 这句话不太理解。本地只有单个用户

redis 保存socketID ;socket 私发消息根据 socketID 来发送;io.sockets.socket(socketid).emit(‘message’, ‘for your eyes only’);

@chenjiyong 🉑️的确可以

@tingtingtinghuang 用户A 发消息给用户 B,服务器接收到以后存储起来. 假设有 实例1, 2, 3 实例1 上的 socket 有 用户 B,D,F , 实例1 每秒去查出数据库里 所有 B,D,F 的待发消息,分别发出. (socketid 直接用用户 id 来存储)

回到顶部