当前位置:首页 > 日记 > 正文

基于Node.js的WebSocket通信实现

基于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 clientvar userConnectionMap = new HashMap();var connectNum = 0;// connectionwebSocketServer.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']);  });});

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

相关文章

PHP基于关联数组20行代码搞定约瑟

PHP基于关联数组20行代码搞定约瑟

数组,约瑟夫,示例,代码,电脑软件,本文实例讲述了PHP基于关联数组20行代码搞定约瑟夫问题。分享给大家供大家参考,具体如下:记得前段时间一写做java开发的兄弟对我说他java60行做了个约瑟夫问题,挺不错的。调侃php应该写这个挺不行的。于是 呵…

详解vuex 中的 state 在组件中如何

详解vuex 中的 state 在组件中如何

组件,详解,电脑软件,state,vuex,前言不知道大家有没有遇到过这样一种情况? vuex中的state会在某一个组建中使用,而这个状态的初始化是通过异步加载完成的。组件在渲染过程中,获取的state状态为空。也就是说组件在异步完成之前就已经完成渲染了…

PS滤镜如何制作彩色玻璃

PS滤镜如何制作彩色玻璃

滤镜,彩色玻璃,电脑软件,PS,   这个教程介绍运用了一系列的滤镜制作玻璃网效果,不过用到的滤镜都是平时非常常用的,如果我们平时多细心一点,也可以用这些滤镜制作更加丰富的创意图形!下面跟小编来了解一下如何用PS滤镜制作彩色玻…

微信小程序教程系列之页面跳转和参

微信小程序教程系列之页面跳转和参

页面跳转,参数传递,教程,程序,系列之,关于页面的跳转,微信小程序提供了3种方法:方法一:使用API wx.navigateTo()函数示例:首先先新建一个test页面如何新建页面?请到先阅读下面教程微信小程序的新建页面 —— 微信小程序教程系列(4)index.wxml:在i…

PS背光如何将深色照片变亮

PS背光如何将深色照片变亮

照片,深色,如何将,变亮,电脑软件,有时在照片中,不容易得到一个自己一个意义上的场景,有逆光,避光,不是拿着好看的风景的美景,而是不怜惜,他又拿了什么光,回家后,画出了好黑的森林啊!如果你有这样的图片,不要把它拿出来,试试下面的方法看看它是否改变了…

win10怎么开启移动热点

win10怎么开启移动热点

热点,电脑软件,Windows10如何用无线网卡创建移动热点?由于有些地方没有网络,所以我们需要使用无线网卡进行上网。无论是无线网卡还是USB无线网卡都有承载网络模式,承载网络是指把接收到的无线信号再创建一个Wifi热点给手机使用,这样是不是就方…

插入PPT幻灯片的视频不能播放(解决

插入PPT幻灯片的视频不能播放(解决

解决方案,幻灯片,不能播放,视频,电脑软件,问题: 一位同事用DVD,格式,工厂软件将它转换成万用视频,并将视频插入PPT幻灯片中。当视频被播放时,视频总是无法播放。 答案uff1a 想一想,操作方法,再操作一遍,在PPT点上插入电影和声音文件>电影,找到相关…

PHP简单的获胜算法(示例)

PHP简单的获胜算法(示例)

算法,示例,简单,电脑软件,PHP,这个包遇到这样一个问题,绘制一个概率函数来在线查找信息。它指出,一种以上的方法,我觉得还是比较容易实现句子的功能或一种以上的代码的想法不止一种。 功能get_rand($ proarr){ 结果=; 概率的总概率 $启源= array…

如何使用ps制作印章

如何使用ps制作印章

印章,如何使用,电脑软件,ps,   ps已经成为了绘图高手必会的软件,更被人尊称为神器,可想而知它的功能有多么强大,而对于ps怎么抠公章,这也是很多photoshop用户询问的一个问题。ps抠公章通常会使用色彩范围或者通道来抠公章。下面跟…

利用滤镜为照片添加阳光透射效果

利用滤镜为照片添加阳光透射效果

阳光,照片,滤镜,效果,电脑软件,   今天小编教大家利用滤镜为照片添加阳光透射效果,希望对大家有用!利用滤镜为照片添加阳光透射效果原图最终效果本PS教程使用径向模糊来制作阳光透射效果。制作的时候先把图片的高光部分选区出来…

ps怎么快速合成被树枝缠绕的创意吉

ps怎么快速合成被树枝缠绕的创意吉

创意,树枝,吉他,快速,电脑软件,效果图创意非常不错,画面也合成得很唯美,只是过程有点少,并且素材没有提供。大家可以去网上找类似的素材去合成。最终效果1、画出线稿图。2、加入树林背景。3、调节好树林高度,底部加上土石纹理。树林地面加上青…

MySQL将查询结果导出到CSV实现方法

MySQL将查询结果导出到CSV实现方法

方法,查询结果,导出到,电脑软件,MySQL,为了将MySQL的查询结果导出到CSV,通常使用PHP连接mysql执行查询,并且使用PHP生成返回的查询结果生成CSV格式,然后导出。 但这更麻烦,它需要服务器安装PHP才能实现。 直接使用MySQL导出CSV方法 我们可以…