全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

基于Node.js的WebSocket通信实现

node的依赖包

node中实现Websocket的依赖包有很多,websocket、ws均可,本文选取ws来实现,首先安装依赖

npm install ws

聊天室实例

假如A,B,C,D用户均通过客户端连接到Websocket服务,其中每个人发的消息都需要将其通过Websocket转发给其他人,此场景类似于服务端将A的消息广播给组内其他用户。

服务端实现

首先来看服务端程序,具体的工作流程分以下几步:

  1. 创建一个WebSocketServer的服务,同时监听8080端口的连接请求。
  2. 每当有新的客户端连接该WebSocket成功时,便将该连接push到连接池的数组中。
  3. 监听message事件,当该事件发生时,遍历连接池,以连接为单位将该消息转发到对应的客户端
  4. 监听close事件,当该事件发生时,将该连接移出连接池

服务端代码

var WebSocketServer = require('ws').Server,
  wss = new WebSocketServer({port: 8080});

// 连接池
var clients = [];

wss.on('connection', function(ws) {
  // 将该连接加入连接池
  clients.push(ws);
  ws.on('message', function(message) {
    // 广播消息
    clients.forEach(function(ws1){
      if(ws1 !== ws) {
        ws1.send(message);
      }
    })
  });

  ws.on('close', function(message) {
    // 连接关闭时,将其移出连接池
    clients = clients.filter(function(ws1){
      return ws1 !== ws
    })
  });
});

客户端实现

<html>
<input type="text" id="text">
<input type="button" onclick="sendMessage()" value="online">
<script>
  var ws = new WebSocket("ws://localhost:8080");

  ws.onopen = function (e) {
    console.log('Connection to server opened');
  }
  ws.onmessage = function(event) { 
    console.log('Client received a message', event); 
  }; 
  ws.onclose = function (e) {
    console.log('connection closed.');
  }
  function sendMessage() {
      ws.send(document.getElementById('text').value);
  }
</script>
</html>

如何发现用户?

通过上述的demo可以看到,WebSocket都是基于连接的,也就是说我们知道data是从那个connection发过来,但并不知道使用客户端的是李雷或者韩梅梅,这可如何是好?再想另一种场景,李雷只想给韩梅梅发消息,不想将消息广播给其他客户端,此时我们就需要在Server端能够标识用户身份和连接的对应关系。

于是,需要在客户端连接到WebSocket之后,紧接着再发一次请求,告诉Server我的user_id是多少,Server将此user_id与connection之间的关系存储在hashmap中,至此就建立了user_id与connection的对应关系。当需要发送消息给对应的客户端,从此hashmap中取出对应用户的connection信息,调用其send方法发出消息即可。

依赖包

npm install hashmap

服务端实现

var WebSocketServer = require('ws').Server, webSocketServer = new WebSocketServer({port: 8080});
var HashMap = require('hashmap');

// record the client
var userConnectionMap = new HashMap();
var connectNum = 0;

// connection
webSocketServer.on('connection', function(ws) {
  ++ connectNum;
  console.log('A client has connected. current connect num is : ' + connectNum);
  ws.on('message', function(message) {
    var objMessage = JSON.parse(message);
    var strType = objMessage['type'];

    switch(strType) {
      case 'online' : 
        userConnectionMap.set(objMessage['from'], ws);
        break;
      default:
        var targetConnection = userConnectionMap.get(objMessage['to']);
        if (targetConnection) {
          targetConnection.send(message);
        }
    }
  });

  ws.on('close', function(message) {
    var objMessage = JSON.parse(message);
    userConnectionMap.remove(objMessage['from']);
  });
});

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# nodejs  # websocket  # nodejs实现websocket  # node  # 如何用JS WebSocket实现简单聊天  # js实现mp3录音通过websocket实时传送+简易波形图效果  # 原生nodejs使用websocket代码分享  # node.js基于express使用websocket的方法  # JS实现websocket长轮询实时消息提示的效果  # nodejs+websocket实时聊天系统改进版  # websocket+node.js实现实时聊天系统问题咨询  # Node.js websocket使用socket.io库实现实时聊天室  # Javascript WebSocket使用实例介绍(简明入门教程)  # 详解JS WebSocket断开原因和心跳机制  # 客户端  # 服务端  # 连接池  # 将该  # 将其  # 连接到  # 的是  # 都是  # 移出  # 有很多  # 遍历  # 是从  # 可以看到  # 均可  # 几步  # 将此  # 来实现  # 类似于  # 这可  # 便将 


相关文章: 详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  如何在香港免费服务器上快速搭建网站?  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  北京网站制作的公司有哪些,北京白云观官方网站?  建站之家VIP精选网站模板与SEO优化教程整合指南  建站之星导航配置指南:自助建站与SEO优化全解析  如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  建站之星logo尺寸如何设置最合适?  网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?  简历在线制作网站免费版,如何创建个人简历?  电商网站制作公司有哪些,1688网是什么意思?  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  深圳网站制作培训,深圳哪些招聘网站比较好?  济南网站制作的价格,历城一职专官方网站?  PHP正则匹配日期和时间(时间戳转换)的实例代码  Android自定义listview布局实现上拉加载下拉刷新功能  如何通过VPS建站实现广告与增值服务盈利?  如何通过PHP快速构建高效问答网站功能?  如何在香港服务器上快速搭建免备案网站?  如何用AWS免费套餐快速搭建高效网站?  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?  如何快速生成专业多端适配建站电话?  网站制作难吗安全吗,做一个网站需要多久时间?  如何通过智能用户系统一键生成高效建站方案?  网站制作费用多少钱,一个网站的运营,需要哪些费用?  宝塔建站无法访问?如何排查配置与端口问题?  建站之星云端配置指南:模板选择与SEO优化一键生成  如何在云服务器上快速搭建个人网站?  内部网站制作流程,如何建立公司内部网站?  ,巨量百应是干嘛的?  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  网站建设设计制作营销公司南阳,如何策划设计和建设网站?  建站之星展会模板:智能建站与自助搭建高效解决方案  建站之星如何快速解决建站难题?  定制建站如何定义?其核心优势是什么?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  建站之星在线版空间:自助建站+智能模板一键生成方案  如何高效完成独享虚拟主机建站?  如何通过二级域名建站提升品牌影响力?  实现虚拟支付需哪些建站技术支撑?  相册网站制作软件,图片上的网址怎么复制?  开心动漫网站制作软件下载,十分开心动画为何停播?  建站主机是否属于云主机类型?  如何高效配置香港服务器实现快速建站?  建站之星如何配置系统实现高效建站?  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。