服务器怎么通过 websocket 主动向前端推送数据?向各位大佬请教

2018-07-23 09:44:41 +08:00
 Rieouu

我的服务器通过 socket 接收到数据,请问怎么通过 websocket 实现后台有数据就推送到前台呢?看了 websocket 的例子,通过 onMessage 方法都是需要前台有消息请求才会触发这个方法,有没有主动的 write 方法直接写到前台呢,希望有做过这方面问题的大佬赐教

15098 次点击
所在节点    程序员
63 条回复
crist
2018-07-23 10:21:19 +08:00
workerman 是可以的,swoole 就不知道了。
satgi
2018-07-23 10:22:19 +08:00
@Rieouu
看#11 代码,我把向客户端发消息的代码封装在 pushMessage 方法里,你什么时候想向客户端发消息,调用 pushMessage 就可以了。

这里的关键是 clients 变量,用来存储已经连接的客户端,只要你想发消息时候可以访问到 clients,就可以向里面的任意客户端发消息。
qinxi
2018-07-23 10:22:27 +08:00
@Rieouu 能筛选出自己需要的东西应该是程序员最基本的技能吧.你说你想要轮胎,别人给你一辆汽车.你说不行,我只要轮胎
xiaopenggggggg
2018-07-23 10:22:50 +08:00
前端是是要订阅 websocket 推送的节点的
myyou
2018-07-23 10:27:46 +08:00
使用消息队列,每一个连接就启动一个线程,这个线程记录连接对象和订阅一个消息频道(消息频道名字写入缓存),持续监听这个消息频道,有消息就推送,服务端只需要向这个消息频道推送消息就行。
Rieouu
2018-07-23 10:30:57 +08:00
@qinxi 说的对,可能是自己不懂的东西就倾向于寻求帮助,bad coder
Rieouu
2018-07-23 10:31:51 +08:00
@myyou 你这个比较靠谱,我正在这方面努力
Rieouu
2018-07-23 10:33:10 +08:00
@satgi 谢谢哈,我正在研究大佬的代码呢
cnit
2018-07-23 10:50:15 +08:00
Rieouu
2018-07-23 10:54:38 +08:00
@cnit 这个不错哦,谢谢
wm5d8b
2018-07-23 12:42:02 +08:00
spring boot 官方不是有现成的例子嘛
jswh
2018-07-23 12:50:54 +08:00
socket io 了解一下
sarices
2018-07-23 13:48:23 +08:00
swoole 我是把服务器当成一个特别客户端,用客户端方式向服务器发送需要推送的消息,然后通过 onMessage 推送到其他客户端
Rieouu
2018-07-23 13:57:17 +08:00
@sarices 还可以这么做吗,服务器用作客户端,我来了解一下
qiayue
2018-07-23 14:00:29 +08:00
可以采用订阅机制
假设你有温度和湿度两个数据,有 A、B 两个页面,A 只需要实时显示温度数据,B 需要实时显示温度和湿度两个数据
浏览器打开 AB 页面后,主动连接到你的 websocket 服务,然后发送需要订阅的数据
websocket 服务有一个 map 记录连接,以及对应的连接订阅了哪些数据
你 netty 收到数据后,通过某种方式传给 websocket 服务(可以通过 http 传,也可以 socket 传,或者其他方式)
websocket 服务每次收到 netty 传过来的一个数据,就从 map 中找出订阅了这个数据的所有连接,循环发送
页面收到收据后,显示出来
Rieouu
2018-07-23 14:02:56 +08:00
@wm5d8b 看来要学习一下 springboot 了
Rieouu
2018-07-23 14:06:30 +08:00
@qiayue 有大佬建议把 netty 收到的消息放到消息队列,websocket 从消息队列读消息发布出去,跟你说的还是挺像的,我正在看着方面,谢谢你的回复~
e8c47a0d
2018-07-23 14:10:30 +08:00
socket.io 把,相当于是一个 WebSocket 的包装,相对自己写会方便很多,碰到不支持 websocket 的浏览器,socket.io 还能用长链接、pooling 模式。
Rieouu
2018-07-23 14:20:21 +08:00
@e8c47a0d 好的,都在看一下
zrlhk
2018-07-23 14:43:33 +08:00
workerman swoole 轮子多了去了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/473206

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX