最近在做node.js websocket的项目,用了ws ws 包,有这样的需求: 1、如当触发某个接口时,我会将特定内容发送给 所有连接用户中的如user A, user B,user C,并且监听user A,user B,user C中与websocket server的交互信息 遇到一些问题,暂时没有很好的思路。 1、 如何将所有在线的连接缓存起来?缓存到内存中的话,当在线连接多时,会不会有内存溢出的问题。 2、如何从所有连接中,找到特定的连接,与其交互,发消息并且监听其的返回。
没有找到很好的 聊天的 开源项目,想借鉴下。
- 可以使用 redis 或者 mongodb 来存储
- socket 对象 header 里有一个属性 sec-websocket-key,这是连接每个客户端的标识,可以使用它来判断是那个客户端连接。
socketServer.on('connection', function (socket) {
// key (存起来,搞事情)
console.log(socket.upgradeReq.headers['sec-websocket-key']);
// address
console.log(socket.upgradeReq.socket.remoteAddress);
});
更多的看 github 上的文档吧,其实还是比较建议使用 socket.io
用socket.io能实现你的要求,即服务器对特定客户端进行推送。
来自酷炫的 CNodeMD
@Lizhooh 首先,谢谢回复。我看了下socket.io的文档,目前不适合我们的场景,底层并不是websocket协议,iOS及android客户端并不能使用ws协议连接,不知道我理解的是否正确
@zswnew 简单看了下socket.io的文档,我理解底层并不是websocket协议,这样的话,iOS及android等客户端应该不能使用标准的ws协议连接node.js websocket server
@zctocm 可以在 客户端 和 服务端 都使用 socket.io 这样肯定能连得上。socket.io 有多个语言实现,包括 java:https://github.com/socketio/socket.io-client-java
你说的是转发吗?写个函数监听就行,然后用for循环转发给每一个人
来自酷炫的 CNodeMD
我明白你啥意思了,你说的第一个问题,你说内存太大,你肯定是用对象传的。用protobuf,转化二进制传,是普通的10倍速度左右。平时编码。然后用的时候解码就行。我最近也在研究wesocket socketio 还有手机端的websocket都做过,只能用二进制传。不然内存越来越大
来自酷炫的 CNodeMD
ws server的clients属性,保存了所有的ws