Node.js网络编程--WebSocket协议


WebSocket简介

HTTP存在的问题

  • 每次客户端和服务器端的交互都是一次HTTP的请求和应答的过程,频繁的请求–响应,增加了每次传输的数据量,浪费带宽资源
  • 不是真正的实时技术,只是模拟实时的效果,轮询会造成同步延迟
  • 编程比较复杂,尤其是要模拟比较真实的实时效果时,实现起来较困难。
    而WebSocket协议能够欧突破HTTP的局限性,解决两端的实时数据传输问题

WebSocket协议实现机制

  1. 在客户端和服务器进行连接时使用的http协议进行一次握手,连接完成后,服务器端将协议升级成WebSocket
  2. 在数据传输阶段,传输时使用数据传输协议(tcp协议)进行传输(特点:面向连接、安全可靠、实时性强)
  3. 关闭连接:任何一方发出关闭连接命令就会关闭

在这里插入图片描述
WebSocket协议的应用场合
实时通信:聊天应用。
实时展示和分析:典型的有实时计数器、图表、日志客户端等。
文档协同:允许多个用户同时编辑一个文档,且用户能够看到每个用户做出的修改。
注意:WebSocket协议不适合那些不支持HTML5或对HTML5支持不够充分的浏览器。


实现WebSocket服务器和客户端

WebSocket库:ws、WebSocket-Node、faye-websocket-node和socket.io。
创建一个WebSocket服务器实例new WebSocket.Server(options[, callback])
WebSocket服务器内置事件
在这里插入图片描述


【案例】构建实时聊天室

创建WebSocket服务器

//1、安装ws模块 npm install ws
//2、导入ws模块
const WebSocket=require('ws');
//3、创建WebSocket服务器
const server=new WebSocket.Server({port:8080});
//4、绑定open事件
server.on('open',()=>{
    console.log('建立连接');
})
//5、绑定close事件
server.on('close',()=>{
    console.log('关闭连接')
})
//6、绑定connection事件 ws参数表示客户端 req表示客户端的请求信息
server.on('connection',(ws,req)=>{
    //6.1获取客户端的ip port
    const ip=req.connection.remoteAddress;
    const port=req.connection.remotePort;
    const clientName=ip+port;
    console.log('%s is connect',clientName);
    //6.2向客户端发送消息
    ws.send('欢迎'+clientName);
    ws.on('message',(msg)=>{
        console.log('消息:%s 来自于 %s',msg,clientName);
        //6.3把消息广播所有客户端:clients表示所有客户端
        server.clients.forEach(function (client) {
            //若某个客户端是打开的,就把消息广播给该客户
            if (client.readyState===WebSocket.OPEN){
                client.send(clientName+'---------'+msg);
            }
        })
    })
})

创建WebSocket客户端

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>聊天室</title>
</head>
<body>
    <script type="text/javascript">
        var scoket;
        //若浏览器不支持WebSocket
        if (!window.WebSocket){
            window.WebSocket=window.MozWebSocket;
        }
        if (window.WebSocket){
            //创建客户端的WebSocket对象
            socket=new WebSocket('ws://localhost:8080/ws')
            //给socket绑定message事件
            socket.onmessage=function (event){
                //获取textarea标签
                let ta=document.getElementById('responseText');
                ta.value=ta.value+'\n'+event.data;
            };
            //给socket绑定open事件 与服务器建立连接
            socket.onopen=function (event){
                let ta=document.getElementById('responseText');
                ta.value='连接开启';
            };
        }else{
            alert('您的浏览器不支持WebSocket协议');
        }
        //定义发送消息的函数
        function send(message){
            if (!window.WebSocket){
                return;
            }
            if (socket.readyState===WebSocket.OPEN){
                //向服务器发送消息
                socket.send(message);
                //清空消息输入框
                document.getElementById('msg').value='';
            }else{
                alert('连接未开启!');
            }
        }
    </script>
    <h2>WebSocket聊天室</h2>
	<!--    关闭表单的提交功能-->
    <form onsubmit="return false">
		<!--    来显示聊天室的聊天记录-->
	    <textarea id="responseText" style="height:300px;width: 500px"></textarea>
	    <br><br>
	    <input type="text" id="msg" name="message" placeholder="请输入消息"style="width: 300px"/>
	    <input type="button" value="发送消息" onclick="send(this.form.message.value)"/>
	    <input type="button" value="清空聊天记录" onclick="javascript:document.getElementById('responseText').value=''">
  </form>
</body>
</html>

服务器页面
在这里插入图片描述
客户端页面
在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值