WebSocket使用demo,node作后端服务器

Posted 飞翔的熊blabla

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WebSocket使用demo,node作后端服务器相关的知识,希望对你有一定的参考价值。

WebSocket使用demo,ws前后端通信,服务器为nodejs
效果
服务端代码
客户端代码
写个ws通信demo看看
后端用的nodejs-websocket
安装完node后
使用npm install nodejs-websocket命令安装socket服务端组件

效果
打开3个网页,一个昵称为111,一个昵称为222,一个昵称为333,可以指定发送人,不输入发送给谁默认就是广播消息
指定发送给谁

广播


服务端代码
var ws = require('nodejs-websocket');
var userMap = {};//服务器维护的客户端连接映射表
var customer = [];//所有客户端
var server = ws.createServer(function(socket){
    if(!dealConnect(socket)){
        console.log("客户端连接失败,没有填写必要的参数[name]")
        socket.sendText('连接失败,请输入昵称后重试');//给客户端返回消息
        socket.close();//关闭连接
        return;
    }
   console.log("新连接到了");
    customer.push(socket);

  // 前端传来的消息处理  事件名称为text,接受文本信息
    socket.on('text', function(str) {
        var data = JSON.parse(str);
        if(data.toUesr&&data.toUesr.length>0){
            socket.sendText("服务器端收到["+data.name+"]给["+data.toUesr+"]发送的消息:"+data.txt);
            //向指定用户发
            sendMsgToUser(data);
        }else{
            console.log("收到前端消息:"+str)
            //广播
            server.connections.forEach(client=>{
                client.sendText("服务器端收到["+data.name+"]发送的消息:"+data.txt);
            })
        }
    });
    // socket.on('connect', function(code) {
    //     console.log('开启连接', code)
    // })
    socket.on('error', function(code) {
        console.log('客户端异常关闭', code)
        socket.close();
        socket=null
    })
    // socket.on('close', function(code) {
    //     console.log('关闭连接', code)
    //     for (const key in customer) {
           
    //     }
    // })
    
}).listen(3000);//监听端口3000

//处理连接请求
function dealConnect(socket){
    if(socket.path&&socket.path.length>0){
        let path = socket.path;
        let name = getValFromPathByKey(path,"name");
        //将拥有用户名的socket添加到用户连接表
        if(name){
            userMap[name] = socket;
            return true;//连接成功
        }
    }
    return false;//连接失败
}

//将消息发给指定用户
function sendMsgToUser(data){
    if(data){
        for (const user in userMap) {
            if(user==data.toUesr){
                userMap[user].sendText("用户"+data.name+"给你发消息了:"+data.txt);
            }
        }
    }
}

//根据key获取path中的参数
function getValFromPathByKey(path,key){
    if(path&&path.length>0){
        let paramsStr = path.substr(path.indexOf("?")+1);
        let KVStrArr = paramsStr.split("&");
        let params = {};
        if(KVStrArr&&KVStrArr.length>0){
            for (let i = 0; i < KVStrArr.length; i++) {
                const item = KVStrArr[i];
                let k = item.split("=")[0];
                let v = item.split("=")[1];
                params[""+k+""] = v;
            }
        }
        return params[key];
    }
    return null;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
客户端代码
<!DOCTYPE html>
<html>

<head>
    <title>My WebSocket</title>
</head>

<body>
    Welcome<br />
    昵称<input id="name" type="text" /></br>
    指定发送给<input id="to" type="text" /></br>
    消息<input id="text" type="text" /></br>
    <div style="display: flex;flex-direction: column;width: 100px;">
        <button class="connect">Connect</button> 
        <button class="send">Send</button> 
        <button class="close">Close</button>
        <button class="clear">Clear</button>
    </div>
    <div id="message">
            
    </div>
</body>
<script type="text/javascript">
    var ws = null;
    window.onload = function(){
        //注册打开websocket连接按钮
        var connectBtn = document.querySelector(".connect");
        connectBtn.onclick = function(e){
            if(ws){
                ws.close();
                ws = null;
            }
            var name = document.querySelector("#name").value;
            // 打开一个websocket, 这里端口号和上面监听的需一致
            ws = new WebSocket('ws://localhost:3000/connect?name='+name);
             //websocket连上后,使用send()方法发送数据
            ws.onopen = function(res) {
                appendToMsgBox("已连接服务端..."+res.currentTarget.url);
            }
            // 服务端发送过来的消息
            ws.onmessage = function(res) {
                appendToMsgBox("服务端:"+JSON.stringify(res.data))
            }
            // 断开websocket触发
            ws.onclose = function(res){
                appendToMsgBox("已断开连接 "+res.currentTarget.url);
            }
        }
        //注册发送消息按钮
        var sendBtn = document.querySelector(".send");
        sendBtn.onclick = function(e){
            if(ws){
                var name = document.querySelector("#name").value;
                var toUesr = document.querySelector("#to").value;
                var txt = document.querySelector("#text").value;
                var data = {
                    txt:txt,
                    toUesr:toUesr,
                    name:name
                };
                ws.send(JSON.stringify(data));
            }else{
                appendToMsgBox("服务端未连接.");
            }
        }
        //注册断开websocket按钮
        var closeBtn = document.querySelector(".close");
        closeBtn.onclick = function(e){
            if(ws){
                ws.close();
                ws = null;
            }else{
                appendToMsgBox("服务端未连接.");
            }
        }
        //注册清除屏幕内容按钮
        var clearBtn = document.querySelector(".clear");
        clearBtn.onclick = function(e){
            document.querySelector("#message").innerHTML = "";
        }
    }
    //将内容显示到屏幕中
    function appendToMsgBox(msg){
        var msgBoxDom = document.querySelector("#message");
        msgBoxDom.innerHTML += new Date().getTime()+"::"+ msg +"</br>";
    }
</script>

</html>

以上是关于WebSocket使用demo,node作后端服务器的主要内容,如果未能解决你的问题,请参考以下文章

Node配合WebSocket做多文件下载以及进度回传

使用Node.js实现数据推送

vue使用WebSocket模拟实现聊天功能-简易版

面试-Websocket

如何利用WebSocket实现网页版聊天室

如何利用WebSocket实现网页版聊天室