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