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