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

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

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

15285 次点击
所在节点    程序员
63 条回复
Rieouu
2018-07-23 09:45:07 +08:00
要是有现成的轮子就更好了
satgi
2018-07-23 09:53:38 +08:00
任何时候,只要获取到已经连接了的客户端就可以。
ben1024
2018-07-23 09:54:56 +08:00
Rieouu
2018-07-23 09:55:31 +08:00
@satgi 请问具体怎么做呢,我对 websocket 不怎么熟所以很迷惑,谢谢
Rieouu
2018-07-23 09:57:33 +08:00
@ben1024 您这个的确符合我的要求,不过要是 Java 的就更好了,看来使用 websocket 肯定是可以实现的,谢谢
qiushijie
2018-07-23 10:00:16 +08:00
用一个 map 把客户端链接保存,然后遍历去发送就行了
Rieouu
2018-07-23 10:02:55 +08:00
@qiushijie 您说的这个发送是指调用某个方法吗,我就是在这里不明白怎么发送消息
liuxu
2018-07-23 10:03:11 +08:00
onMessage 更像一个路由,所有人连到 onMessage,让它来处理
lsls931011
2018-07-23 10:05:23 +08:00
opengps
2018-07-23 10:05:51 +08:00
连接之后,谁都可以互相发送,你需要的是每个 websocket 有个 id 标识,长连接建立后,通过 id 识别,直接推送,前端就会收到
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);
```
windfarer
2018-07-23 10:05:59 +08:00
neoblackcap
2018-07-23 10:06:55 +08:00
1.到底是 webscoket 还是 socket 这个要分清
2.如 6L @qiushijie 所说,你先记录好每个连接到底是谁,然后分别对每个连接写你要推送的消息就好了
mokeyjay
2018-07-23 10:07:27 +08:00
用你的语言+空格+websocket 作为关键词组搜一下不就知道了
Rieouu
2018-07-23 10:10:51 +08:00
@neoblackcap sorry 没说清楚哈,我要发送的消息是服务器通过 socket 接收的,是一个 TCP 消息,接收到消息后要把它显示到前端,所以用 websocket,看了各位大佬的回复,我还是先把 websocket 弄清楚,谢谢您
aurelia
2018-07-23 10:11:26 +08:00
多监听一个 tcp 或者 http 端口 后台有新数据 就请求 轮询 fd 或者直接在后台发送 ws 发送完就断掉也是可以的
neoblackcap
2018-07-23 10:12:55 +08:00
@Rieouu 你这样显然要求建立两组连接吧,一组 websocket,一组 socket,socket 收到数据,然后通过队列之类的方式,批量往 websocket 写入消息
Rieouu
2018-07-23 10:17:33 +08:00
@neoblackcap 目前使用的是 netty 接收消息,本来想的是 netty 收到消息直接通过 websocket 推送,然后坐了半天没做出来,实验室项目老师催得紧所以在 v 站向大佬提问。。用消息队列会不会太麻烦了,毕竟以前没弄过
Rieouu
2018-07-23 10:19:17 +08:00
@mokeyjay 搜到一大堆聊天室都不是我想要的,所以来 v 站寻求大佬帮助
qinxi
2018-07-23 10:21:06 +08:00
你消息怎么来的在这个场景中不重要.重要的是你现在需要往网页上推送,那就使用 websocket ,最基本的 百度都能搜出来.

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

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

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

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

© 2021 V2EX