补充一下~
和 @月下 私信讨论私信功能的时候,告知我,我的私信是以广播形式发送的,这是不正确的方式,因为针对某个用户的私信消息,使用广播形式的话,对于不需要接收消息的用户,是一种带宽资源的浪费。
因此自己又研究了一下,想到2种实现的方式。
1、使用列队数组的方式
当登陆的用户,客户端连接上服务端socket的时候,做一个数组列队[{ userId, socketId }, ...],记录用户id、socketId,方便通过用户的id找到该用户的socketId,然后用这个socket发送消息,socket断开的时候,再从数组列队中移除。
2、房间聊天的方式
当登陆的用户,客户端连接上服务端socket的时候,加入到一个以用户id命名的房间,发送私信的时候发送到这个房间,socket断开的时候,同时离开这个房间。
自己感觉2的方式简单一些,不用自己维护一个数组列队,因为考虑一个账号可能多平台登陆,也需要小广播消息,所以暂时先用这个方式实现了。
加入房间
socket.join(userId, ()=>{});
https://socket.io/docs/server-api/#socket-join-room-callback
给房间发送事件消息
io.sockets.to(userId).emit('an event', { some: 'data' });
https://socket.io/docs/server-api/#socket-to-room
socket断开连接的时候,离开用户的房间
socket.leave(userId, ()=>{})
https://socket.io/docs/server-api/#socket-leave-room-callback