宝哥软件园

用nodejs搭建websocket服务器

编辑:宝哥软件园 来源:互联网 时间:2021-09-06

简单开始

1.安装节点. https://nodejs.org/en/

2.安装《华盛顿明星报》模块

ws:是nodejs的一个WebSocket库,可以用来创建服务https://github.com/websockets/ws

3.server.js

在项目里面新建一个server.js,创建服务,指定8181端口,将收到的消息原木出来。

var WebSocketServer=require('ws ').服务器,WSS=新的WebSocketserver({端口: 8181 });wss.on('connection ',函数(ws){ console。日志(“客户端已连接”);ws.on('message ',function(message){ console。日志(消息);});});4.建立一个client.html。

在页面上建立一个WebSocket的连接。用派遣方法发送消息。

var ws=new WebSocket(' ws ://localhost :8181 ');ws。onopen=功能(e){控制台。日志('与服务器的连接已打开');}函数发送消息(){ ws。发送($(“# message”).val());}页面:

html xmlns=' http://www。w3。org/1999/XHTML ' head meta http-equiv=' Content-Type ' Content=' text/html;charset=utf-8 '/title WebSocket Echo Demo/title meta name=' viewport ' content=' width=device-width,initial-scale=1'/link href='./bootstrap-3。3 .5/CSS/bootstrap。量滴CSS ' rel='样式表'/脚本src='http:/js/jquery-1。12 .3 .量滴js '/script脚本src=' http :/js/jquery-1。12 .3 .量滴js '/script脚本src=' http :/bootstrap-3。3 .5/js/自举。量滴js '/script脚本var ws=new WebSocket(' ws :///localhost :8181 ');ws。onopen=功能(e){控制台。日志('与服务器的连接已打开');}函数发送消息(){ ws。发送($(“# message”).val());}/script/head body div class=' vertical-center ' div class=' container ' p/p form角色=' form ' id=' chat _ form ' on submit=' sendmail();返回falsediv类=' form-group '输入类=' form-control '类型=' text '名称=' message ' id=' message '占位符='在此键入要回显的文本value=' '//div button Type=' button ' id=' send ' class=' BTN BTN-primary ' onclick=' sendmail();发送!/button /form /div /div/body/html运行之后如下,服务端即时获得客户端的消息。

模拟股票

上面的例子很简单,只是为了演示如何运用nodejs的《华盛顿明星报》创建一个WebSocket服务器。且可以接受客户端的消息。那么下面这个例子演示股票的实时更新。客服端只需要连接一次,服务器端会不断地发送新数据,客户端收数据后更新用户界面.页面如下,有五只股票,开始和停止按钮测试连接和关闭。

服务端:

1.模拟五只股票的涨跌。

var stocks={ 'AAPL': 95.0,' MSFT': 50.0,' AMZN': 300.0,' GOOG': 550.0,' YHOO ' : 35.0 }函数随机化间隔(最小值、最大值){返回数学。地板(数学。random()*(max-min 1)min);} var stockUpdatervar randomStockUpdater=function(){ for(股票中的定义变量符号){ if(stocks.hasOwnProperty(符号)){ var随机化变化=随机化区间(-150,150);var floatChange=随机化的更改/100;股票[符号]=浮动变化;} } var randomMSTime=randomInterval(500,2500);股票更新程序=setTimeout(function(){ randomStockUpdater();},randomMSTime);} randomStockUpdater();2.连接建立之后就开始更新数据

wss.on('connection ',function(ws){ var sendStockUpdates=function(ws){ if(ws。readystate==1){ var stock sobj={ };for(var I=0;I client stocks . lengthi){ var symbol=client stocks[I];股票符号]=股票[符号];} if (stocksObj.length!==0){ ws。发送(JSON。stringify(stocksObj));//需要将对象转成字符串网络套接字。只支持文本和二进制数据console.log('更新,JSON。stringify(stocksObj));} } } var clientStockUpdater=setInterval(function(){ sendStockUpdates(ws);}, 1000);ws.on('message ',function(message){ var stock request=JSON。解析(消息);//根据请求过来的数据来更新console.log('收到消息,库存请求);客户股票=股票请求['股票'];sendStockUpdates(ws);});客户端:

建立连接:

var ws=new WebSocket(' ws ://localhost :8181 ');onopen直接只有在连接成功后才会触发,在这个时候将客户端需要请求的股票发送给服务端。

var isClose=false var stocks={ ' AAPL ' : 0,' MSFT': 0,' AMZN': 0,' GOOG': 0,' YHOO ' : 0 };函数updataUI(){ ws。onopen=功能(e){控制台。日志('与服务器的连接已打开');isClose=falsews。发送(JSON。stringify(stock _ request));控制台。日志(' sened a mesg ');} //更新UI var changestokentry=函数(符号,原始值,新值){ var valElem=$(' # '符号' span ');瓦勒姆。html(新值。to fixed(2));if(新值originalValue){ valelem。add class(' label-danger ');瓦勒姆。移除类(' label-success ');} else if(新值originalValue){ valelem。add class(' label-success ');瓦勒姆。移除类别('标签-危险');} } //处理受到的消息ws。on message=function(e){ var stocksData=JSON。解析(例如数据);控制台。日志(stocksData);for(stocksData中的定义变量符号){ if (stocksData.hasOwnProperty(符号)){ changeStockEntry(符号,股票[符号],stocksData[符号]);股票[符号]=股票数据[符号];} } };} updataUI();运行效果如下:只需要请求一次,数据就会不断的更新,效果是不是很赞,不用轮询,也不用长连接那么麻烦了。文章末尾会附上所有源码。

(美股的涨跌和A股的颜色是反的,即红跌绿涨)

实时聊天

上面的例子是连接建立之后,服务端不断给客户端发送数据。接下来例子是一个简单的聊天室类的例子。可以建立多个连接。

1.安装node-uuid模块,用来给每个连接一个唯一号。

2.服务端消息发送

消息类型分通知和消息两种,前者是提示信息,后者是聊天内容。消息还包含一个身份证、昵称和消息内容。在上一节有学习到readyState有四个值,打开表示连接建立可以发送消息。如果页面关闭了,为网络套接字.关闭。

函数wsSend(类型,client_uuid,昵称,消息){ for(var I=0;一。客户i ) { var clientSocket=clients[i].ws;if(客户端套接字。readystate===web套接字.OPEN){客户端套接字。发送(JSON。stringify({ ' type ' : type,' id': client_uuid '昵称' :昵称,' message ' : message });} }}3.服务端处理连接

每新增加一个连接,都会发送一条匿名用户的加入的提示消息,如果消息中带有"/尼克"认为这一个修改昵称的消息。然后更新客户端的昵称。其他都会当做聊天消息处理。

wss.on('连接'),函数(ws){ var client _ uuid=uuid。v4();定义变量昵称=' anonymousser ' client index client索引=1;客户。push({ ' id ' : client _ uuid,' ws': ws '昵称' :昵称});console.log('客户端[%s]已连接,client _ uuid);var connect_message=昵称"已连接";wsSend('通知',client_uuid,昵称,connect _ message);console.log('客户端[%s]已连接,client _ uuid);ws.on('消息'),函数(消息){ if(消息。indexof('/nick '===0){ var昵称_ array=消息。split(');如果(昵称_数组。长度=2){ var old _昵称=昵称;昵称=昵称_数组[1];定义变量昵称_消息='客户端'旧_昵称'更改为昵称';wsSend('nick_update ',client_uuid,昵称,昵称_ message);} } else { wsSend('message ',client_uuid,昵称,消息);} });处理连接关闭:

var closeSocket=函数(自定义消息){ for(var I=0;一。客户i ) {如果(客户[i].id==client _ uuid){ var disconnect _ message;if(自定义消息){ disconnect _ message=自定义消息;} else { disconnect_message=昵称"已断开";} wsSend('notification ',client_uuid,昵称,disconnect _ message);clients.splice(i,1);} } };ws.on('close ',function(){ closeSocket();});4.客户端

没有启动时,页面如下,改变按钮用来修改昵称。

div class=' vertical-center ' div class=' container ' ul id=' messages ' class=' list-unstyled '/ul HR/form role=' form ' id=' chat _ form ' on submit=' sendmail();返回false ' div class=' form-group ' input class=' form-control ' Type=' text ' id=' message ' name=' message ' placeholder='在此键入要回显的文本value=' autofocus///div button Type=' button ' id=' send ' class=' BTN BTN-primary ' onclick=' sendmail();'send Message/button/form div class=' form-group ' spannikenput id:/spannikenput id=' name ' type=' text '/button class=' BTN BTN-sm BTN-info ' onclick=' changName();变更/按钮/div/div/div js :

//建立连接var ws=new WebSocket(' ws ://localhost :8181 ');定义变量昵称=' ';ws。onopen=功能(e){控制台。日志('与服务器的连接已打开');} //显示函数附录日志(类型、昵称、消息){ if(消息类型=='未定义')返回;var messages=文档。getelementbyid(' messages ');var messageElem=文档。创建元素(“李”);var preface _ label lif(type==' notification '){ preface _ label=' span class= ' label label-info ' */span ';} else if(type==' nick _ update '){ preface _ label=' span class= ' label label-warning ' */span ';} else { preface _ label=' span class= ' label label-success ' '昵称/span ';} var message _ text=' H2 ' preface _ label ' ' message '/H2;messageelem。innerhtml=message _ text消息。append child(messageElem);} //收到消息处理ws。on message=function(e){ var data=JSON。解析(例如数据);昵称=数据。昵称;appendLog(data.type,data。昵称,数据。消息);console.log('ID: [%s]=%s ',data.id,data。消息);} ws.onclose=函数{附录日志('连接关闭');console.log("连接已关闭");} //发送消息函数sendmail(){ var messageField=document。getelementbyid(' message ');if (ws.readyState===WebSocket .OPEN){ ws。send(messagefield。值);} message field . value=message field。焦点();} //修改名称函数changName() { var name=$('#name ').val();if (ws.readyState===WebSocket .OPEN){ ws。发送('/nick '名称);} }运行结果:

页面关闭之后,连接马上断开。

这种实时响应体验不能太爽,代码清爽,前端体验更好。客户端不必一直发送请求,服务器也不必等待轮询。

总结:以上例子中的代码很容易理解。接下来,学习WebSocket协议。

演示下载:http://xiazai.jb51.net/201701/yuanma/websocket_jb51.rar

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

更多资讯
游戏推荐
更多+