
我的服务器通过 socket 接收到数据,请问怎么通过 websocket 实现后台有数据就推送到前台呢?看了 websocket 的例子,通过 onMessage 方法都是需要前台有消息请求才会触发这个方法,有没有主动的 write 方法直接写到前台呢,希望有做过这方面问题的大佬赐教
1 Rieouu OP 要是有现成的轮子就更好了 |
2 satgi 2018 年 7 月 23 日 任何时候,只要获取到已经连接了的客户端就可以。 |
3 ben1024 2018 年 7 月 23 日 |
6 qiushijie 2018 年 7 月 23 日 via Android 用一个 map 把客户端链接保存,然后遍历去发送就行了 |
8 liuxu 2018 年 7 月 23 日 onMessage 更像一个路由,所有人连到 onMessage,让它来处理 |
9 lsls931011 2018 年 7 月 23 日 |
10 opengps 2018 年 7 月 23 日 连接之后,谁都可以互相发送,你需要的是每个 websocket 有个 id 标识,长连接建立后,通过 id 识别,直接推送,前端就会收到 |
11 satgi 2018 年 7 月 23 日 ``` let clients = []; wss.on('connection', ws => { clients.push(ws); // onMessage ws.on('message', message => { pushMessage('message received'); }); }); function pushMessage (message) { clients.forEach(client =>{ client.send(message); }); } // data received from socket, then push to clients let data = dataFromSocket; pushMessage(data); ``` |
13 neoblackcap 2018 年 7 月 23 日 1.到底是 webscoket 还是 socket 这个要分清 2.如 6L @qiushijie 所说,你先记录好每个连接到底是谁,然后分别对每个连接写你要推送的消息就好了 |
14 mokeyjay 2018 年 7 月 23 日 用你的语言+空格+websocket 作为关键词组搜一下不就知道了 |
15 Rieouu OP @neoblackcap sorry 没说清楚哈,我要发送的消息是服务器通过 socket 接收的,是一个 TCP 消息,接收到消息后要把它显示到前端,所以用 websocket,看了各位大佬的回复,我还是先把 websocket 弄清楚,谢谢您 |
16 aurelia 2018 年 7 月 23 日 多监听一个 tcp 或者 http 端口 后台有新数据 就请求 轮询 fd 或者直接在后台发送 ws 发送完就断掉也是可以的 |
17 neoblackcap 2018 年 7 月 23 日 @Rieouu 你这样显然要求建立两组连接吧,一组 websocket,一组 socket,socket 收到数据,然后通过队列之类的方式,批量往 websocket 写入消息 |
18 Rieouu OP @neoblackcap 目前使用的是 netty 接收消息,本来想的是 netty 收到消息直接通过 websocket 推送,然后坐了半天没做出来,实验室项目老师催得紧所以在 v 站向大佬提问。。用消息队列会不会太麻烦了,毕竟以前没弄过 |
20 qinxi 2018 年 7 月 23 日 你消息怎么来的在这个场景中不重要.重要的是你现在需要往网页上推送,那就使用 websocket ,最基本的 百度都能搜出来. |
21 crist 2018 年 7 月 23 日 workerman 是可以的,swoole 就不知道了。 |
22 satgi 2018 年 7 月 23 日 @Rieouu 看#11 代码,我把向客户端发消息的代码封装在 pushMessage 方法里,你什么时候想向客户端发消息,调用 pushMessage 就可以了。 这里的关键是 clients 变量,用来存储已经连接的客户端,只要你想发消息时候可以访问到 clients,就可以向里面的任意客户端发消息。 |
24 xiaopenggggggg 2018 年 7 月 23 日 前端是是要订阅 websocket 推送的节点的 |
25 myyou 2018 年 7 月 23 日 使用消息队列,每一个连接就启动一个线程,这个线程记录连接对象和订阅一个消息频道(消息频道名字写入缓存),持续监听这个消息频道,有消息就推送,服务端只需要向这个消息频道推送消息就行。 |
29 cnit 2018 年 7 月 23 日 |
31 wm5d8b 2018 年 7 月 23 日 via Android spring boot 官方不是有现成的例子嘛 |
32 jswh 2018 年 7 月 23 日 socket io 了解一下 |
33 sarices 2018 年 7 月 23 日 swoole 我是把服务器当成一个特别客户端,用客户端方式向服务器发送需要推送的消息,然后通过 onMessage 推送到其他客户端 |
35 qiayue PRO 可以采用订阅机制 假设你有温度和湿度两个数据,有 A、B 两个页面,A 只需要实时显示温度数据,B 需要实时显示温度和湿度两个数据 浏览器打开 AB 页面后,主动连接到你的 websocket 服务,然后发送需要订阅的数据 websocket 服务有一个 map 记录连接,以及对应的连接订阅了哪些数据 你 netty 收到数据后,通过某种方式传给 websocket 服务(可以通过 http 传,也可以 socket 传,或者其他方式) websocket 服务每次收到 netty 传过来的一个数据,就从 map 中找出订阅了这个数据的所有连接,循环发送 页面收到收据后,显示出来 |
37 Rieouu OP @qiayue 有大佬建议把 netty 收到的消息放到消息队列,websocket 从消息队列读消息发布出去,跟你说的还是挺像的,我正在看着方面,谢谢你的回复~ |
38 e8c47a0d 2018 年 7 月 23 日 |
40 zrlhk 2018 年 7 月 23 日 workerman swoole 轮子多了去了 |
45 pipixia 2018 年 7 月 23 日 via Android 记得 tomcat 有现成的 websocket 直接在 onMessage 里面遍历 session 发过去就行了 |
47 tilv37 2018 年 7 月 23 日 应该可以在服务端维护一个客户端的 map 啊,然后取出制定客户端的连接推消息就行了 |
48 mary9 2018 年 7 月 23 日 |
49 limbo0 2018 年 7 月 23 日 单端推送可以看看 sse |
50 xm0625 2018 年 7 月 23 日 可以去看下我 BusHelper 项目 中间用到了 WebSocket 技术 |
56 wdlth 2018 年 7 月 23 日 把 Session 存起来,找到 Session 就发 |
58 kba977 2018 年 7 月 24 日 |
59 hosaos 2018 年 7 月 24 日 netty socket io 包含了自动重连一些封装好的功能 可以看看 |
62 ynkkdev 2019 年 3 月 20 日 大佬,你的问题最后是怎么解决的?我的需求和你几乎一样,也是有一个 socket 客户端,接收到消息以后需要利用 websocket 推送到 web 前端,只不过我是 py,可以说一下你最后的解决思路吗 |
63 Rieouu OP @youngce 我的后台使用的是 springboot+springmvc,接收 socket 请求使用的是 netty,思路就是 netty 收到数据后对数据进行解析并包装成前端需要的 JSON 形式,然后通过 websocket 直接推送给所有的客户端,你只要在 websocket 保存每一个 websocket 连接,然后封装好相应的 push 推送方法,我当时是参考这个做的: https://www.cnblogs.com/xdp-gacl/p/5193279.html |