Node.js--WebSocket使用示例
<div><span style="font-size: 18px"><strong><span style="font-family: verdana, geneva">一、基本使用</span></strong></span></div><div><span style="font-size: 16px"><strong><span style="font-family: verdana, geneva">1.安装node</span></strong></span></div>
<div><span style="font-family: verdana, geneva">https://nodejs.org/en/ </span></div>
<div><span style="font-family: verdana, geneva"> </span></div>
<div><span style="font-size: 16px"><strong><span style="font-family: verdana, geneva">2.安装ws模块</span></strong></span></div>
<div><span style="font-family: verdana, geneva">ws:是nodejs的一个WebSocket库,可以用来创建服务。 https://github.com/websockets/ws</span></div>
<div><span style="font-family: verdana, geneva">npm install ws</span></div>
<div><span style="font-family: verdana, geneva"> </span></div>
<div><span style="font-size: 16px"><strong><span style="font-family: verdana, geneva">3.创建服务端</span></strong></span></div>
<div><span style="font-family: verdana, geneva">在项目里面新建一个server.js,创建服务,指定8181端口,将收到的消息log出来。</span></div>
<div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> WebSocketServer = require('ws'<span style="color: rgba(0, 0, 0, 1)">).Server,
wss </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> WebSocketServer({ port: 8181<span style="color: rgba(0, 0, 0, 1)"> });
wss.on(</span>'connection', <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> (ws) {
console.log(</span>'client connected'<span style="color: rgba(0, 0, 0, 1)">);
ws.on(</span>'message', <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> (message) {
console.log(message);
});
});</span></pre>
</div>
</div>
<div><span style="font-family: verdana, geneva"> </span></div>
<div><span style="font-size: 16px"><strong><span style="font-family: verdana, geneva">4.创建客户端</span></strong></span></div>
<div><span style="font-family: verdana, geneva">在页面上建立一个WebSocket的连接。用send方法发送消息。</span></div>
<div>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 0, 255, 1)">var</span> ws = <span style="color: rgba(0, 0, 255, 1)">new</span> WebSocket("ws://localhost:8181"<span style="color: rgba(0, 0, 0, 1)">);
ws.onopen </span>= <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> (e) {
console.log(</span>'Connection to server opened'<span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> sendMessage() {
ws.send($(</span>'#message'<span style="color: rgba(0, 0, 0, 1)">).val());
}</span></pre>
</div>
</div>
<div><span style="font-family: verdana, geneva">运行之后如下,服务端即时获得客户端的消息。</span></div>
<div><span style="font-family: verdana, geneva"><img src="https://img2020.cnblogs.com/blog/1138955/202012/1138955-20201212161138400-427014668.png"></span></div>
<div><span style="font-family: verdana, geneva">上面的例子很简单,只是为了演示如何运用nodejs的ws创建一个WebSocket服务器。且可以接受客户端的消息。</span></div>
<div><span style="font-family: verdana, geneva"> </span></div>
<div><span style="font-size: 18px"><strong><span style="font-family: verdana, geneva">二、示例--股票刷新</span></strong></span></div>
<div><span style="font-family: verdana, geneva">下面这个例子演示股票的实时更新。客服端只需要连接一次,服务器端会不断地发送新数据,客户端收数据后更新UI.页面如下,有五只股票,开始和停止按钮测试连接和关闭。</span></div>
<div><span style="font-family: verdana, geneva"><img src="https://img2020.cnblogs.com/blog/1138955/202012/1138955-20201212161412906-450254824.gif"></span></div>
<div> </div>
<div><span style="font-size: 18px"><strong><span style="font-family: verdana, geneva">二、示例--聊天室</span></strong></span></div>
<div><span style="font-family: verdana, geneva">上面的例子是连接建立之后,服务端不断给客户端发送数据。接下来例子是一个简单的聊天室类的例子。可以建立多个连接。</span></div>
<div><span style="font-size: 16px"><strong><span style="font-family: verdana, geneva">1.安装node-uuid模块,用来给每个连接一个唯一号。</span></strong></span></div>
<div><span style="font-family: verdana, geneva">npm install node-uuid</span></div>
<div><span style="font-size: 16px"><strong><span style="font-family: verdana, geneva"> </span></strong></span></div>
<div><span style="font-size: 16px"><strong><span style="font-family: verdana, geneva">2.服务端消息发送</span></strong></span></div>
<div><span style="font-family: verdana, geneva">消息类型分notification和message两种,前者是提示信息,后者是聊天内容。消息还包含一个id、昵称和消息内容。</span></div>
<div><span style="font-family: verdana, geneva">我们好知道readyState有四个值,OPEN表示连接建立可以发送消息。如果页面关闭了,为WebSocket.CLOSE。</span></div>
<div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> wsSend(type, client_uuid, nickname, message) {
</span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> i = 0; i < clients.length; i++<span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 0, 255, 1)">var</span> clientSocket =<span style="color: rgba(0, 0, 0, 1)"> clients.ws;
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (clientSocket.readyState ===<span style="color: rgba(0, 0, 0, 1)"> WebSocket.OPEN) {
clientSocket.send(JSON.stringify({
</span>"type"<span style="color: rgba(0, 0, 0, 1)">: type,
</span>"id"<span style="color: rgba(0, 0, 0, 1)">: client_uuid,
</span>"nickname"<span style="color: rgba(0, 0, 0, 1)">: nickname,
</span>"message"<span style="color: rgba(0, 0, 0, 1)">: message
}));
}
}
}</span></pre>
</div>
</div>
<div><span style="font-family: verdana, geneva"> </span></div>
<div><span style="font-size: 16px"><strong><span style="font-family: verdana, geneva">3.服务端处理连接</span></strong></span></div>
<div><span style="font-family: verdana, geneva">每新增加一个连接,都会发送一条匿名用户的加入的提示消息,如果消息中带有“/nick” 认为这一个修改昵称的消息。然后更新客户端的昵称。其他都会当做聊天消息处理。</span></div>
<div>
<div class="cnblogs_code">
<pre>wss.on('connection', <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(ws) {
</span><span style="color: rgba(0, 0, 255, 1)">var</span> client_uuid =<span style="color: rgba(0, 0, 0, 1)"> uuid.v4();
</span><span style="color: rgba(0, 0, 255, 1)">var</span> nickname = "AnonymousUser" +<span style="color: rgba(0, 0, 0, 1)"> clientIndex;
clientIndex </span>+= 1<span style="color: rgba(0, 0, 0, 1)">;
clients.push({ </span>"id": client_uuid, "ws": ws, "nickname"<span style="color: rgba(0, 0, 0, 1)">: nickname });
console.log(</span>'client [%s] connected'<span style="color: rgba(0, 0, 0, 1)">, client_uuid);
</span><span style="color: rgba(0, 0, 255, 1)">var</span> connect_message = nickname + " has connected"<span style="color: rgba(0, 0, 0, 1)">;
wsSend(</span>"notification"<span style="color: rgba(0, 0, 0, 1)">, client_uuid, nickname, connect_message);
console.log(</span>'client [%s] connected'<span style="color: rgba(0, 0, 0, 1)">, client_uuid);
ws.on(</span>'message', <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(message) {
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (message.indexOf('/nick') === 0<span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 0, 255, 1)">var</span> nickname_array = message.split(' '<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (nickname_array.length >= 2<span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 0, 255, 1)">var</span> old_nickname =<span style="color: rgba(0, 0, 0, 1)"> nickname;
nickname </span>= nickname_array;
</span><span style="color: rgba(0, 0, 255, 1)">var</span> nickname_message = "Client " + old_nickname + " changed to " +<span style="color: rgba(0, 0, 0, 1)"> nickname;
wsSend(</span>"nick_update"<span style="color: rgba(0, 0, 0, 1)">, client_uuid, nickname, nickname_message);
}
} </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
wsSend(</span>"message"<span style="color: rgba(0, 0, 0, 1)">, client_uuid, nickname, message);
}
});</span></pre>
</div>
</div>
<div><span style="font-family: verdana, geneva">处理连接关闭:</span></div>
<div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> closeSocket = <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(customMessage) {
</span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> i = 0; i < clients.length; i++<span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (clients.id ==<span style="color: rgba(0, 0, 0, 1)"> client_uuid) {
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> disconnect_message;
</span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (customMessage) {
disconnect_message </span>=<span style="color: rgba(0, 0, 0, 1)"> customMessage;
} </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
disconnect_message </span>= nickname + " has disconnected"<span style="color: rgba(0, 0, 0, 1)">;
}
wsSend(</span>"notification"<span style="color: rgba(0, 0, 0, 1)">, client_uuid, nickname, disconnect_message);
clients.splice(i, </span>1<span style="color: rgba(0, 0, 0, 1)">);
}
}
};
ws.on(</span>'close', <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> () {
closeSocket();
});</span></pre>
</div>
</div>
<div><span style="font-family: verdana, geneva"> </span></div>
<div><span style="font-size: 16px"><strong><span style="font-family: verdana, geneva">4.客户端</span></strong></span></div>
<div><span style="font-family: verdana, geneva"><img src="https://img2020.cnblogs.com/blog/1138955/202012/1138955-20201212161656042-1113923263.gif"></span></div>
<div><span style="font-family: verdana, geneva"> 页面关闭之后,连接马上断开。</span></div>
<div><span style="font-family: verdana, geneva"><img alt="" data-media-type="image" data-attr-org-src-id="C8B5762903F942D7B0037A203840CD79"></span></div>
<div><span style="font-family: verdana, geneva"> </span></div>
<div><span style="font-family: verdana, geneva"> API:WebSocket API</span></div>
<div><span style="font-family: verdana, geneva"> </span></div>
<p><span style="font-family: verdana, geneva"></span></p><br><br>
来源:https://www.cnblogs.com/absoluteli/p/14125083.html
頁:
[1]