node.js websocket如何缓存每一个连接?并与每一个特定连接交互
发布于 7 年前 作者 zctocm 5599 次浏览 来自 问答

最近在做node.js websocket的项目,用了ws ws 包,有这样的需求: 1、如当触发某个接口时,我会将特定内容发送给 所有连接用户中的如user A, user B,user C,并且监听user A,user B,user C中与websocket server的交互信息 遇到一些问题,暂时没有很好的思路。 1、 如何将所有在线的连接缓存起来?缓存到内存中的话,当在线连接多时,会不会有内存溢出的问题。 2、如何从所有连接中,找到特定的连接,与其交互,发消息并且监听其的返回。

没有找到很好的 聊天的 开源项目,想借鉴下。

8 回复
  1. 可以使用 redis 或者 mongodb 来存储
  2. 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

回到顶部