网络-WebSocket

这篇具有很好参考价值的文章主要介绍了网络-WebSocket。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。



前言

本文主要记录WebSocket的简单介绍和使用,完成群聊的demo


一、WebSocket简介

WebSocket是一种通信协议,它通过单个TCP连接提供全双工的通信通道。
它允许客户端和服务器之间进行实时的双向通信。
与传统的HTTP请求不同,WebSocket建立了客户端和服务器之间的持久连接,从而实现了高效和低延迟的通信。

要建立WebSocket连接,客户端向服务器发送WebSocket握手请求,服务器则以WebSocket握手响应进行回应。
一旦连接建立,客户端和服务器都可以异步地发送消息。

WebSocket采用基于消息的通信模型,消息以帧的形式通过WebSocket连接发送。
这些帧可以是二进制或文本形式,具体取决于应用程序的需求。
该协议还支持消息分片、用于保持连接的ping/pong消息以及用于优雅终止连接的关闭消息等功能。
WebSocket得到了大多数现代Web浏览器的支持,并且可以在服务器端应用程序中使用提供WebSocket功能的库或框架

应用场景

  • 实时性要求高,如:聊天、游戏、数据可视化
  • 需要频繁交换数据,如:实时协作工具、文件管理器
  • 需要推送服务的应用,如:实时数据监控、通知系统
  • 跨平台应用,如:桌面应用、移动端应用

它提供了比长轮询或服务器推送事件(SSE)更高效的替代方案。

原理

  • 握手阶段:客户端发送一个HTTP请求给服务器,请求升级为WebSocket协议。在请求头中包含一些特殊的字段,如UpgradeConnection,表明客户端希望升级到WebSocket协议,这里也可以使用这里也可以使用WebSocket API进行通讯API进行通讯,实际也是发送GET请求带特殊请求头。服务器收到请求后,如果支持WebSocket协议,则返回一个HTTP响应,状态码为101 Switching Protocols,表示升级成功。

网络-WebSocket,网络,网络,websocket,网络协议

  • 建立连接:一旦握手成功,客户端和服务器之间建立了一个持久的双向连接。这个连接是基于TCP的,可以实现全双工通信,即客户端和服务器可以同时发送和接收消息。
    数据传输:客户端和服务器可以通过WebSocket连接发送和接收消息。消息以帧的形式进行传输,可以是二进制数据或文本数据。帧包含了一些控制信息,如消息类型、消息长度等。客户端和服务器可以异步地发送和接收消息,实现实时的双向通信。
  • 保持连接:WebSocket连接是持久的,不会像传统的HTTP请求那样每次都需要重新建立连接。为了保持连接的活跃状态,客户端和服务器可以定期发送心跳消息,以确保连接不会断开。
  • 关闭连接:当客户端或服务器希望关闭WebSocket连接时,可以发送一个关闭帧。接收到关闭帧的一方会响应一个关闭帧,然后双方的连接会被正常关闭。

二、使用

  • 创建ws对象
const ws = new WebSocket('ws://localhost:8080');
  • 监听连接成功
ws.onopen = function () {
            console.log('已连接')
        }
  • 发送消息
ws.send('发送的消息')
  • 接收消息
 ws.onmessage = function (e) {
            console.log(e.message)
        }
  • 断开连接
ws.close()
  • 监听断开连接
ws.onclose = function() {
            console.log('WebSocket连接已关闭');
        };
  • 监听连接错误
ws.onerror = function(error) {
            console.error('WebSocket连接发生错误:', error);
        };
  • 事件监听器
    WS是可以添加事件监听器的,如open、message、close、error等与属性效果是一致的。
 ws.addEventListener('open',function (event) {
            console.log('连接成功')
            isConnected = true;
        })
ws.addEventListener('message',(e)=>{
            let li = document.createElement('li')

            let data = JSON.parse(e.data)
            if (data.type == 2){
                li.innerText = data.message
                list.appendChild(li)
            }else {
                console.log(data.message)
            }
        })

心跳监测

socket连接在长时间不使用、网络波动、弱网状况下有可能断开连接,需要进行心跳监测来保证连接存活。在断开连接时,实现重连,在进行心跳消息发送时,客户端需要将心跳监测信息过滤掉。

 let heartInreaval = null
    const heartCheck = () =>{
        // 等于open 发送心跳
        if (socket.readyState === ws.OPEN){
            socket.send(JSON.stringify({
                type:state.HEART,
                message:'心跳检测'
            }))
        }else {
            clearInterval(heartInreaval)
        }
    }
    setInterval(heartCheck,5000)

广播消息

在后端直接使用send发送消息只能针对点对点的,不能将消息发送给全部连接,需要使用clients属性遍历发送,达到广播的效果

 // 广播消息
        wss.clients.forEach((client)=>{
            client.send(JSON.stringify({
                type:state.MESSAGE,
                message:e.toString()
            }))
        })

三、群聊demo

前端:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div>
    <ul id="list"></ul>
    <input type="text" id="input">
    <button id="send">发送</button>
    <button id="stop">断开连接</button>
</div>
</body>
<script>
    // 连接状态
    let isConnected = false;
    let input = document.getElementById('input')
    let btn = document.getElementById('send')
    let list = document.getElementById('list')
    let stop = document.getElementById('stop')
    function connectWebSocket() {
        // 创建ws实例
        const ws = new WebSocket('ws://localhost:8080');
        // 监听连接成功
        ws.addEventListener('open',function (event) {
            console.log('连接成功')
            isConnected = true;
        })
        btn.addEventListener('click',function () {
            if (input.value){
                // send发送消息
                ws.send(input.value)
                input.value = ''
            }
        })
        ws.addEventListener('message',(e)=>{
            let li = document.createElement('li')

            let data = JSON.parse(e.data)
            if (data.type == 2){
                li.innerText = data.message
                list.appendChild(li)
            }else {
                console.log(data.message)
            }
        })
        //断开连接
        stop.addEventListener('click',()=>{
            ws.close()
        })
        // ws.onopen = function () {
        //     console.log('已连接')
        // ws.send('发送的消息')
        // ws.onmessage = function (e) {
        //     console.log(e.message)
        // }
        // }
        ws.onclose = function() {
            console.log('WebSocket连接已关闭');
            isConnected = false;
            // 进行重连
            reconnect();
        };

        // 监听WebSocket连接发生错误事件
        ws.onerror = function(error) {
            console.error('WebSocket连接发生错误:', error);
            isConnected = false;
            // 进行重连
            reconnect();
        };
    }
    // 重连函数
    function reconnect() {
        if (!isConnected) {
            console.log('尝试重新连接...');
            setTimeout(connectWebSocket, 5000);
        }
    }
    connectWebSocket()

</script>
</html>

后端:这里使用Node

//安装 ws
const ws =require('ws')
// 创建socket服务
const wss = new ws.Server({port:8080},()=>{
    console.log('socket服务启动成功')
})

//心跳枚举
const state = {
    HEART:1,
    MESSAGE:2
}

// 监听客户端连接
wss.on('connection',(socket)=>{
    //监听客户端消息
    console.log('客户端连接成功')
    socket.on('message',(e)=>{
        console.log(e.toString())
        // 广播消息
        wss.clients.forEach((client)=>{
            client.send(JSON.stringify({
                type:state.MESSAGE,
                message:e.toString()
            }))
        })
    })
    let heartInreaval = null
    const heartCheck = () =>{
        // 等于open 发送心跳
        if (socket.readyState === ws.OPEN){
            socket.send(JSON.stringify({
                type:state.HEART,
                message:'心跳检测'
            }))
        }else {
            clearInterval(heartInreaval)
        }
    }
    setInterval(heartCheck,5000)
})

网络-WebSocket,网络,网络,websocket,网络协议


总结

WebSocket通过握手阶段建立持久的双向连接,然后通过帧的方式传输数据,实现实时的双向通信。它相比传统的HTTP请求具有更低的延迟和更高的效率,适用于需要实时更新的Web应用程序。文章来源地址https://www.toymoban.com/news/detail-725508.html

到了这里,关于网络-WebSocket的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端面试:【网络协议与性能优化】HTTP/HTTPS、TCP/IP和WebSocket

    嗨,亲爱的Web开发者!在构建现代Web应用时,了解网络协议是优化性能和确保安全性的关键。本文将深入探讨HTTP/HTTPS、TCP/IP和WebSocket这三个网络协议,帮助你理解它们的作用以及如何优化Web应用的性能。 1. HTTP/HTTPS协议: HTTP(超文本传输协议): HTTP是用于在Web上传输数据的

    2024年02月11日
    浏览(38)
  • Go语言github.com/gorilla/websocket框架websocket协议通信实战

          websocket是实际开发中比较常用的应用层协议,本文利用github.com/gorilla/websocket框架进行websocket通信实战。 目录 1.下载github.com/gorilla/websocket 2.websocket服务端 3.websocket Go客户端 4.websocket 网页客户端 5.运行结果展示 go get github.com/gorilla/websocket 服务器:  Go语言客户端:  We

    2024年02月16日
    浏览(35)
  • [前端基础]websocket协议

    (1)websocket websocket(简写为ws),是一种轻量化的协议,经过最开始的握手阶段以后,前后端之间允许自由地发送信息不受限制(建议发送json字符串).虽然理论上这个东西是属于协议内容,但是已经被疯狂封装得像框架一样了. websocket协议具有天然的优势处理前端多线程并发,并且只需要一

    2024年02月08日
    浏览(32)
  • WebSocket 协议及其使用案例

    WebSocket 协议是一种用于实时通信、全双工的网络协议。它运行在传输层之上,通常基于 TCP 连接。相较于传统的 HTTP 协议,WebSocket 协议能够在单个连接上进行 双向通信 ,实现 数据的实时交互 ,因此在实时性较高的应用中表现得尤为出色。 WebSocket 协议是一种允许服务器和客

    2024年02月10日
    浏览(27)
  • WebSocket协议介绍

    WebSocket 协议是一种基于 TCP 的通讯协议,它允许双向通信,使客户端和服务器之间的数据交换变得更加高效。在本文中,我们会深入了解 WebSocket 协议以及它对现代 Web 应用程序的重要性和应用场景。   WebSocket 协议是一种全双工的通讯协议,它使用标准 HTTP/HTTPS 端口(80 和

    2024年02月14日
    浏览(30)
  • java实现websocket握手协议

    其中最重要的是最后几个换行不要丢,将字符串转成byte[]写给客户端即可 收到的掩码转换 下面是服务器向客户端发送消息

    2024年02月08日
    浏览(28)
  • netty对websocket协议的实现

    1. websocket协议 websocket协议是对http协议的扩充, 也是使用的TCP协议可以全双工通信的应用层协议。 websocket协议允许服务端向客户端推送消息。 浏览器和服务端只需要进行一次握手,不必像http协议一样,每次连接都要新建立连接,两者之间创建持久性的连接,并进行双向的数

    2024年01月20日
    浏览(31)
  • Websocket协议-http协议-tcp协议区别和相同点

    通讯形式 单工通讯-数据只能单向传送一方来发送数据,另一方来接收数据 半双工通讯-数据能双向传送但不能同时双向传送 全双工通讯-数据能够同时双向传送和接受 注:http的通讯方式是分版本 http1.0 :单工。因为是短连接,客户端发起请求之后,服务端处理完请求并收到

    2024年02月15日
    浏览(38)
  • WebSocket和HTTP协议有什么区别?&& 连环问:WebSocket和HTTP长轮询的区别?

    什么是WebSocket? 答:WebSocket是一种网络传输协议,可在单个TCP连接上进行全双工通信,位于OSI模型的应用层。 特点: 1. TCP连接,与HTTP协议兼容 2. 双向通信,主动推送(服务端向客户端) 3. 无同源限制,协议标识符是ws(加密wss) WebSocket: 1. 支持端对端通讯 2. 可以由client发起

    2024年02月11日
    浏览(30)
  • WebSocket协议理解并实现在线聊天

    写在前面 WebSocket 简称 ws 本文通过介绍ws,然后一步步的使用ws协议进行前后端开发测试,最后使用 SpringBoot 和 vue 利用ws协议达实现一个在线聊天室的小demo(源码在文章末尾)。 看完此篇后将能够完成这样的小demo (需要会使用springboot和vue2以及element-ui) WebSocket是在 HTML5 开

    2024年02月04日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包