html和node.js实现websocket

websocket

websocket是HTML5开始提供的一种单个TCP连接上进行全双工通讯的协议。它让客户端和服务端之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性连接,并进行双向数据传输。它能更好的节省服务器资源和带宽,并且能够更实时的通讯。
传统方式采用的是ajax轮询。即在特定的时间间隔,由浏览器对服务器发送http请求,然后由服务器返回最新的数据给客户端。

创建websocket对象

var wx = new WebSocket(url, [protocol]);
url指定连接的URL,protocol可选,指定可接受的子协议

webSocket属性

ws.readyState属性
0 - 表示连接尚未建立
1 - 表示连接已经建立
2 - 表示连接正在进行关闭
3 - 表示连接已经关闭或者连接不能打开

webSocket事件

ws.onopen - 连接建立时触发
ws.onmessage - 客户端接收服务端数据时触发
ws.oclose - 连接关闭时触发
ws.onerroe - 通信发生错误时触发

webSocket方法

ws.send() 使用连接发送数据
ws.close() 关闭连接

示例:

创建两个html文件,模拟两个客户端

<body>
    <p>小明</p>
    <button id='send'>发送</button>
    <input type='text' id='inputText'>
    <p id='dispStatus'>正在连接...</p>

        <script>
                var inputText=document.getElementById('inputText');     
                var dispStatus=document.getElementById('dispStatus'); 
                var ws=new WebSocket('ws://192.168.1.136:8000');    //创建websocket连接,,服务端的IP+端口号
                ws.onopen=function(e){  //开始创建连接时的事件
                    ws.send("xiaoming")
                }

                ws.onmessage=function(e){   //读取服务端接收到的信息
                    document.getElementById('send').onclick=function(e){
                        var time = new Date();
                        var hours = time.getHours();
                        var minutes = time.getMinutes();
                        var seconds = time.getSeconds();
                        var nowTime =hours+":"+minutes+":"+seconds
                        ws.send(nowTime + "===小明==>" + inputText.value);   //向服务端发送输入框中的值
                    }
                    
                    dispStatus.innerHTML+= "<br/>"+e.data;        //信息显示
                }

                ws.onclose = function(){
                    dispStatus.innerHTM +="<br/>服务器关闭"
                }

                ws.onerror = function() {
                    dispStatus.innerHTM +="<br/>连接出错"
                }
            </script>
</body>
<body>
    <p>小李</p>
    <button id='send'>发送</button>
    <input type='text' id='inputText'>
    <p id='dispStatus'>正在连接...</p>

        <script>
            var inputText=document.getElementById('inputText');
            var dispStatus=document.getElementById('dispStatus');
            var ws=new WebSocket('ws://192.168.1.136:8000');    //创建websocket连接,,服务端的IP+端口号
            ws.onopen=function(e){  //开始创建连接时的事件
                ws.send("xiaoli")
            }

            ws.onmessage=function(e){   //读取服务端接收到的信息

                document.getElementById('send').onclick=function(e){   
                    var time = new Date();
                    var hours = time.getHours();
                    var minutes = time.getMinutes();
                    var seconds = time.getSeconds();
                    var nowTime =hours+":"+minutes+":"+seconds
                    ws.send(nowTime + "===小李==>" + inputText.value);   //向服务端发送输入框中的值
                }

                dispStatus.innerHTML+= "<br/>"+e.data;        //将信息显示出来
            }

            ws.onclose = function(){
                dispStatus.innerHTM +="<br/>服务器关闭"
            }

            ws.onerror = function() {
                dispStatus.innerHTM +="<br/>连接出错"
            }
        </script>
</body>

 server.js模拟服务器

var ws=require("nodejs-websocket");     //引入websocket模块
console.log("开始建立连接...");         //后台打印状态信息


var name1 = null,
    name2 = null, 
    name1Ready = false, 
    name2Ready = false;
var server=ws.createServer(function(connect){       //创建一个新连接
    connect.on("text",function(msg){        //接收触发事件
        console.log("收到的消息是:"+msg);      //接收到新消息之后在后台打印出来
        if(msg === "xiaoming"){
            name1 = connect;
            name1Ready = true;
            name1.sendText("小明连接成功!")
        }
        if(msg === "xiaoli"){
            name2 = connect;
            name2Ready = true;
            name2.sendText("小李连接成功!")
        }
        if(name2Ready && name1Ready){
            name1.sendText(msg);
            name2.sendText(msg);
        }

        // connect.sendText(msg)
    });
    connect.on("close", function(code, reason) {
        console.log("连接关闭")
    });
    connect.on("error", function(code, reason) {

    });

}).listen(8000)
console.log("websocket 建立完毕")

 

原文地址:https://www.cnblogs.com/aizz/p/9797489.html