CNode

node.js websocket如何缓存每一个连接?并与每一个特定连接交互

问答
Zzctocm发布于9 年前最后回复9 年前8 回复6228 浏览0 收藏

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

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

查看回复

回复 (8)

L
Lizhooh#1·9 年前
  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

Z
zswnew#2·9 年前

用socket.io能实现你的要求,即服务器对特定客户端进行推送。

来自酷炫的 CNodeMD

Z
zctocm#3·9 年前
引用 Lizhooh1. 可以使用 redis 或者 mongodb 来存储 2. socket 对象 header 里有一个属性 sec websocket key,这是连接每个客户端的标识,可以使用它来判断是...

@Lizhooh 首先,谢谢回复。我看了下socket.io的文档,目前不适合我们的场景,底层并不是websocket协议,iOS及android客户端并不能使用ws协议连接,不知道我理解的是否正确

Z
zctocm#4·9 年前
引用 zswnew用socket.io能实现你的要求,即服务器对特定客户端进行推送。 来自酷炫的 CNodeMD

@zswnew 简单看了下socket.io的文档,我理解底层并不是websocket协议,这样的话,iOS及android等客户端应该不能使用标准的ws协议连接node.js websocket server

A
a69694510#6·9 年前

你说的是转发吗?写个函数监听就行,然后用for循环转发给每一个人

来自酷炫的 CNodeMD

A
a69694510#7·9 年前

我明白你啥意思了,你说的第一个问题,你说内存太大,你肯定是用对象传的。用protobuf,转化二进制传,是普通的10倍速度左右。平时编码。然后用的时候解码就行。我最近也在研究wesocket socketio 还有手机端的websocket都做过,只能用二进制传。不然内存越来越大

来自酷炫的 CNodeMD

S
shrpcn#8·9 年前

ws server的clients属性,保存了所有的ws

参与回复
登录后即可参与回复。登录