node-websocket-server实现两两客户端双向通信最佳实践

PortWatcher
  • 2k

假设有如下场景:

有浏览器A和浏览器B,后端采用nodejs + node-websocket-server。现想办法让他们通过nodejs,采用websocket实现双向通信。

由于每一个连接到服务器的客户端都会被node-websocket-server指定一个conn.id,所以尝试如下方法:
当连接建立的时候,把服务器分配给他们的id发送给客户端浏览器,客户端把这个id记下。然后,假设A要向B发送消息,则发送一个

{ senderId: 12345, receiverId: 67890 }

给服务器,然后服务器调用

server.send(receiverId, JSON.stringify(msgToSend));

也就是:

server.send(67890, data);

但是测试发现客户端B没有反应,甚至连客户端的onmessage事件都没有触发。但如果是:

server.send(senderId, JSON.stringify(msgToSend));

的话,客户端A可以接收到自己发出去的消息。

看来通过这个server分配的id来实现通信失败了。
猜测一下:在node-websocket-server中,每一个被响应的connection事件都是独立的,其分配的conn.id不能被其他connection访问。
这样一来,要实现A和B通信的话,似乎必须得用server.broadcast(data)来广播数据。可是这样一来,浪费了大量资源,同时流量将大大增加,简直不能算是解决方案。

小弟不才,恳请各位指教,小弟先在这里谢谢大家了!

回复
阅读 9.4k
3 个回答

就是使用server.send(conn.id, data)
失败的原因是因为node-websocket-server的一个缺陷。在manager.js的find方法中,匹配客户端队列中的id和需要发送的id的时候使用了“===”,而不是“==”,导致manager找不到这个id,也就发不出去。
将“===”修改为“==”之后使用正常。

看来current.id和id的类型是不同的。

建议采用Server Sent Events ,你可以使用redis服务器存储频道消息,用nodejs去取频道消息,实现一个订阅接口,一个取消订阅接口,一个查询接口即可,详情你自己看协议吧,很简单,我已经应用在已上线的机场项目中了,绝对可靠 Sever Sent Events

宣传栏