Nodejs - WebSocket实现前后端交互

WebSocket

说到网络协议不得不说 HTTP,但是HTTP 协议有一个明显的缺陷:通信只能由客户端发起。
服务器数据发送变化并不能主动告知客户端,而需要让客户端不断轮询以检查服务器数据是否变化。
效率低不说,还很浪费资源。

在此背景下,HTML5 定义了 WebSocket协议,可在单个TCP连接上进行 全双工通信 ,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。

Websocket 使用 ws 或 wss 的 统一资源标志符(URI)。其中 wss 表示使用了 TLS的Websocket

ws://example.com/wsapi
wss://secure.example.com/wsapi

WebsocketHTTPHTTPS 使用相同的 TCP端口,可以绕过大多数防火墙的限制。默认情况下,Websocket 协议使用 80端口;运行在 TLS 之上时,默认使用 443端口

本文服务器端采用的是 NodeJs
可戳本处 进行下载

同时配置 cnpm(npm淘宝镜像)

npm install -g cnpm --registry=https://registry.npm.taobao.org

验证:

cnpm -v

Project

本文实例目录:

node_modules
client.html
server.js

目前仅实现文本交互。

库包

服务器端采用了nodejs-websocket 库(可戳)

安装:

cnpm install nodejs-websocket

在这里插入图片描述
出现以上结果则在该目录下会自动生成 node_modules 文件夹

  • node_modules

服务端

var ws = require("nodejs-websocket");
console.log("Connecting ...");

var server = ws.createServer(function(conn){
    
    

    conn.on("text",function(str){
    
    
        //服务端打印接收到的数据
        console.log("News:" + str);
        //接收到的数据打上标记“Server-”,再发送回客户端
        conn.sendText("Server-"+str);
    });

    conn.on("close",function(code,reason) {
    
    
        console.log("Disconnected.");
    });

    conn.on("error",function(code,reason) {
    
    
        console.log("Error.")
    });
}).listen(8848);

console.log("Server runing!");
  • server.js

客户端

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Game1 Test Demo</title>
</head>

<body>

    <div id="mess">正在连接...</div>
    <div>
        <button id="state1" >第一重</button>
        <button id="state2">第二重</button>
        <button id="state3">第三重</button><br><br>
        <a> 已发送:</a>
        <a id="sendnews"></a><br>
        <a>已接收:</a>
        <a id="receivenews"></a>
    </div>

    <script>
        var mess = document.getElementById("mess");
        if(window.WebSocket){
     
     
            //这里修改为本机IP地址
            var ws = new WebSocket('ws://10.0.2.15:8848');

            ws.onopen = function(e){
     
     
                console.log("连接服务器成功");
                mess.innerHTML = "连接成功"
                ws.send("TestClient");
            }

            ws.onclose = function(e){
     
     
                console.log("服务器关闭");
                mess.innerHTML = "服务器关闭"
            }

            ws.onerror = function(){
     
     
                console.log("连接出错");
                mess.innerHTML = "连接出错"
            }

            //收到服务器数据后的回调函数
            ws.onmessage = function(e){
     
     
                document.getElementById("receivenews").innerHTML=e.data;
            }

            //设置点击事件
            document.getElementById("state1").onclick = function(e){
     
     
                ws.send("昨夜西风凋碧树,独上西楼,望尽天涯路。");
                document.getElementById("sendnews").innerHTML="昨夜西风凋碧树,独上西楼,望尽天涯路。"
            }
            document.getElementById("state2").onclick = function(e){
     
     
                ws.send("衣带渐宽终不悔,为伊消得人憔悴。");
                document.getElementById("sendnews").innerHTML="衣带渐宽终不悔,为伊消得人憔悴。"
            }
            document.getElementById("state3").onclick = function(e){
     
     
                ws.send("众里寻他千百度,蓦然回首,那人却在灯火阑珊处。");
                document.getElementById("sendnews").innerHTML="众里寻他千百度,蓦然回首,那人却在灯火阑珊处。"
            }
        }
    </script>
</body>

</html>
  • client.html

测试

先开启服务器

node server.js

再打开 client.html

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_40774605/article/details/106626706