重生之我要当前端大王–node篇--06websocket

重生之我要当前端大王–node篇

第一篇章 后端服务篇–nodeJS启动!

06websocket

前言

阅读本章学习使用实时通信,websocket

一、websocket是什么?

WebSocket 是一种网络通信协议,提供了浏览器与服务器之间的全双工通信能力。这意味着可以在建立连接后,浏览器和服务器之间随时互相发送数据,而不需要像传统的 HTTP 请求那样,每次通信都需要建立新的请求。

二、使用步骤

1.引入库

借助ws使用webcoket: pnpm i ws

首先先了解websocket的主要事件

open:当 WebSocket 连接成功建立时,会触发 open 事件。

message:当客户端接收到服务器发送的消息时,会触发 message 事件。这个消息可以是文本或二进制数据。

error:如果在连接过程中发生错误,或者连接无法继续进行时,会触发 error 事件。

close:当 WebSocket 连接关闭时,会触发 close 事件。这可能是因为客户端或服务器端主动关闭连接,或者是因为发生了错误。

2.接下来用代码实现一个简易聊天

后端:

const websocket=require('ws')
;((websocket)=>{
const server=new websocket.Server({port:8311})
    const init=()=>{
        bindhandle()

    }
    const messageTypes = {
            'EVENT_keepAlive': 1,
            'EVENT_mesage': 2
          };
    const bindhandle=()=>{
        server.on('error',handleError)
        server.on('connection',handleConnection)

    }
    const handleError=()=>{
        console.log('error');

    }
    //客户端连接触发
    const handleConnection=(socket)=>{
        console.log('客户端连接');
        //监听message接收客户端发送的信息,是一个buffer对象,需要toString()才能查看内容
        socket.on('message',(msg)=>{
            server.clients.forEach((client=>{        
                //对客户端发送的消息进行广播,传递给连接到的客户端
                if(client.readyState==websocket.OPEN){
                    client.send(JSON.stringify({
                        type:messageTypes.EVENT_mesage,
                        message:msg.toString()
                    }))
                }
               }))
        })
        //websocket长时间不通信会断掉,隔五秒发送一个心跳包进行保持连接
        let timer=null
        const keepAlive=()=>{
            if(socket.readyState==websocket.OPEN){
            timer= setInterval(()=>{
                socket.send(JSON.stringify({
                    type:messageTypes.EVENT_keepAlive,
                    message:'保持鲜活'
                }))
                },5000)
            }else{
                //客户端断开连接清除计时器,停止发心跳包
                clearInterval(timer)
            }
        }
        keepAlive()
    }
    init()
})(websocket)

前端

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div>
        <input type="text"  id="username" placeholder="请输入用户名">
    </div>
    <div>
        <input type="text" id="inp">
        <button id="send">send</button>
    </div>
    <div>
        <button id="leave">离开</button>
    </div>
    <div id="box">
    </div>
    <script>
        let box=document.querySelector('#box')
        //通过WebSocket连接服务端
        const ws=new WebSocket('ws://localhost:8311')
        //监听open事件
        ws.addEventListener('open',()=>{
            console.log('连接成功');
        })
        //发送消息,通过ws.send传递消息
        send.onclick=()=>{
        if(inp.value&&username.value){
            ws.send(JSON.stringify({
                username:username.value,
                centent:inp.value
            }))
            inp.value=''
        }   
        }
        ws.addEventListener('close',()=>{
             ws.close()
          })
          //监听广播事件
        ws.addEventListener('message',(val)=>{
            let data=JSON.parse(val.data)
            if(data.type==2){
          let val=JSON.parse(data.message)
            let message=document.createElement('div')
            message.innerHTML=
            `
            <h3>${val.username}</h3>
            <p>${val.centent}
            <span>${new Date().toLocaleString()}</span>
            </p>
            `
        box.appendChild(message)
            }

            })
            //断开连接
            const leave=document.querySelector('#leave')
            leave.onclick=()=>{
                ws.close()
                alert('成功断开连接')
            }
 </script>
</body>
</html>

启动服务查看一下,能否进行通信
在这里插入图片描述
在这里插入图片描述

总结

以上就是今天要讲的内容,如何使用websocket进行实时通信,本文到此结束,你的点赞是我更新的动力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值