当前位置:   article > 正文

nodejs消息推送之ws_node推送ws

node推送ws

nodejs服务器端,如何消息的类型为test就返回消息,反之则群发:

  1. const WebSocket = require('ws');
  2. const wss = new WebSocket.Server({port:3030})
  3. const connection = {}
  4. wss.on('connection',ws => {
  5. ws.on('message',message => {
  6. console.log(JSON.stringify(connection))
  7. message = JSON.parse(message)
  8. if(message.type === 'test') {
  9. connection[message.id] = ws
  10. console.log(connection)
  11. console.log('received: %s',JSON.stringify(message))
  12. if(!!connection[message.id])
  13. connection[message.id].send(JSON.stringify(message))
  14. }else {
  15. ws.clients.forEach(function each(client) {
  16. client.send(message);
  17. });
  18. }
  19. });
  20. })

nodejs之客户端:

  1. const WebSocket = require('ws');
  2. const ws = new WebSocket('ws://127.0.0.1:3030');
  3. ws.on('open',() =>{
  4. let msg = {type:'test',id:1}
  5. ws.send(JSON.stringify(msg));
  6. })
  7. ws.on('error', err => {
  8. console.log(err)
  9. })
  10. ws.on('message',data => {
  11. console.log(data)
  12. })
  13. ws.on('close',(code,reason) => {
  14. console.log(code);
  15. console.log(reason+'=========='+typeof reason)
  16. })

html页面客户端:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>skynet websocket example</title>
  5. </head>
  6. <body>
  7. <script>
  8. var ws = new WebSocket("ws://127.0.0.1:3030");
  9. ws.onopen = function(){
  10. alert("open");
  11. ws.send("WebSocket hellowrold!!");
  12. };
  13. ws.onmessage = function(ev){
  14. alert(ev.data);
  15. };
  16. ws.onclose = function(ev){
  17. alert("close");
  18. };
  19. ws.onerror = function(ev){
  20. console.log(ev);
  21. alert("error");
  22. };
  23. </script>
  24. </body>
  25. <html>

以上是一个很简单的消息服务机制。但是在nodejs中,大家都知道,是可以使用pm2启动多个进程的。在多个进程启动之后,就不能保证消息能够正常的发送到指定的客服端了。下面给大家说一下一个普遍的示例,用来解决这个问题:

单进程消息机制:只需要在本地启动appServer,客服端连接即可。要实现群聊,只需要在appServer中,转发消息即可。私聊,则在用户每一次连接的时候,使用用户的userId为key将连接保存到服务器即可。

多进程消息机制:

1,单独在服务器启一个消息服务。作为中间服务器转发功能命名:syncWsServer。

 2,在本地根据express来开启一个Server,命名为appServer。首先。appServer会连接到syncWsServer服务上,并保存连接。其次在appServer中如果有用  户连接,则使用用户的userId为key将此连接保存起来。

3,在发消息的时候,首先判断客服端(cliet)在appServer中是否有连接,如有连接则直接通过连接发送给用户。如果没有,将消息发送给syncWsServer。 通过syncWsServer来群发消息保证,消息发送给已连接的用户。
        
        如果我们的消息Server是启动的多个进程。假如aClient连接到的是AServer,bClient连接到的是BServer。当然AServer和BServer是同一份带码的不同进程。这个时候,aClient如果想要和bClient进行通信。则需要aClient将消息发送给AServer,AServer在服务端找不到bClient的连接,则将消息发送给syncWsServer。syncWsServer会将收到的消息群发。因为AServer和BServer都会带代码启动的时候,默认连接到syncWsServer。此时就能保证BServer能收到消息。在BServer中收到消息后,BServer会根据消息中的userId来找到bClient的连接,然后将消息正确的传送给bClient。
 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/576071
推荐阅读
相关标签
  

闽ICP备14008679号