您当前的位置:首页 > 电脑百科 > 网络技术 > 网络知识

浅谈WebSocket协议在Web领域的应用

时间:2023-12-08 13:20:06  来源:微信公众号  作者:移动Labs

Part 01、WebSocket是什么?  

WebSocket是一种在Web应用程序中提供双向通信的协议。它允许服务器主动向客户端推送数据,而不是像传统的HTTP请求-响应模式一样,客户端必须发送请求才能获取数据。WebSocket 最早是在html5中引入的,建立在HTTP协议之上,使用握手阶段来升级连接,然后通过保持连接的状态来实现实时通信。

与传统的HTTP协议相比,WebSocket具有以下优势:

⑴ 增强实时性

服务器可以随时主动给客户端下发数据,相对于HTTP请求需要等待客户端发起请求服务端才能响应,延迟明显更少。和传统的轮询比较,WebSocket也可以在短时间内更有效率地传递数据;

⑵ 维持连接状态

在一些需要身份认证的场景下,HTTP请求可能需要在每个请求都携带状态信息(服务器不记录每次的请求和响应信息),而WebSocket一次连接建立后就会保持住会话状态,这就使其成为一种有状态的协议,后续通信时就可以省略部分状态信息;

⑶ 更灵活的扩展支持

开发者可以对WebSocket自定义二进制帧,相对HTTP,可以更轻松地处理二进制内容,此外开发者也自行扩展协议、实现部分自定义的子协议;

⑷ 更好的压缩效果

WebSocket在适当的扩展支持下,可以沿用之前内容的上下文,在传递类似的数据时,可以显著地提高压缩率。

Part 02、 Websocket报文 

2.1 报文格式

浅谈WebSocket协议在Web领域的应用

- 第0个字节

0位(FIN):0表示报文没有结束,1表示报文结束。

1-3位(RSV1、RSV2、RSV3):保留字段,一般全部为0。也可用于扩展自己的协议。

4-7位(opcode):报文类型。0 代表一个继续帧,1代表文本帧,2代表二进制帧,8 代表连接关闭,9 代表ping,10代表pong。

- 第1个字节

8位(MASK):1表示需要掩码操作,0表示不需要。如果为1,数据帧的masking-key属性会存在一个值,接收方会利用这个值来进行解掩码操作,所有从客户端传输到服务器的数据帧的Mask都被设置为1。

9-15位(Payload len):表示Payload data的长度。如果值是0~125,则真实长度就是前7位表示;如果值是126,则真实长度就是后16位(Extended payload length 126);如果值是127,则真实长度就是后64位(Extended payload length 127)

2.2 报文样例

- ping帧,Opcode=9,Mask=1,Payload len=0,Masking-Key有内容

浅谈WebSocket协议在Web领域的应用图片

- pong帧,Opcode=10,Mask=0,Payload len=0,Masking-Key为空

浅谈WebSocket协议在Web领域的应用

- 文本帧,Opcode=1,Mask=0,Payload len=84,Masking-Key为空

浅谈WebSocket协议在Web领域的应用

Part 03、  代码实现  

接下来,一起动手编写WebSocket服务端和客户端,这里提供一个JAVA版的服务端demo和一个html版的客户端demo。

1、服务端demo是一个springboot项目

- 引用spring-boot-starter-websocket依赖

<!-- WebSocket -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

- session管理

public class WsSessionManager {
    public static ConcurrentHashMap<String, WebSocketSession> SESSION_POOL = new ConcurrentHashMap<>();
    public static void add(String key, WebSocketSession session) {
        SESSION_POOL.put(key, session);
    }
    public static WebSocketSession remove(String key) {
        return SESSION_POOL.remove(key);
    }
    public static void removeAndClose(String key) {
        WebSocketSession session = remove(key);
        if (session != null) {
            try {
                session.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    public static WebSocketSession get(String key) {
        return SESSION_POOL.get(key);
    }
}

- 消息处理

@Component
@Slf4j
public class MyWsHandler extends AbstractWebSocketHandler {
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        log.info("建立ws连接,sessionId:{}", session.getId());
        WsSessionManager.add(session.getId(), session);
    }
    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        // 获得客户端传来的消息
        String payload = message.getPayload();
        log.info("server 接收到消息, sessionId " + session.getId() + ", payload: " + payload);
        session.sendMessage(new TextMessage("server 发送给的消息 " + payload + ",发送时间:" + LocalDateTime.now().toString()));
    }
    @Override
    protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) {
        log.info("发送二进制消息, sessionId " + session.getId());
    }
    @Override
    public void handleTransportError(WebSocketSession session, Throwable exception) {
        log.error("异常处理, sessionId " + session.getId());

- WebSocket配置

@Configuration
@EnableWebSocket
public class WsServerConfig implements WebSocketConfigurer {
    @Autowired
    private MyWsHandler myWsHandler;
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(myWsHandler, "myWs")
                //允许跨域
                .setAllowedOrigins("*");
    }
}

2、客户端demo是一个html网页

<!doctype html>
<form name="publish">
  <input type="text" name="message" maxlength="50"/>
  <input type="submit" value="Send"/>
</form>
<div id="messages"></div>
<script>
let url='ws://127.0.0.1:8889/myWs';
let socket = new WebSocket(url);
// send message from the form
document.forms.publish.onsubmit = function() {
  let outgoingMessage = this.message.value;
  socket.send(outgoingMessage);
  return false;
};
// handle incoming messages
socket.onmessage = function(event) {
  let incomingMessage = event.data;
  showMessage(incomingMessage);
};
socket.onclose = event => console.log(`Closed ${event.code}`);
// show message in div#messages
function showMessage(message) {
  let messageElem = document.createElement('div');
  messageElem.textContent = message;
  document.getElementById('messages').prepend(messageElem);

Part 04、 结束语  

WebSocket适用于服务器端需要快速向浏览器发送消息的场景,例如网页游戏、视频网站、在线文档、运维工具等。浏览器可以看做是一个瘦客户端,它不提供直接操作tcp长连接的编程接口,也无法简单地集成消息组件客户端。在使用浏览器作为客户端的场景下,WebSocket是最常用的服务器端主动推送方案。

当然,有很多种技术可以实现服务器端向客户端主动推送消息,WebSocket只是其中一种,其他常见的方案还有tcp长连接、消息组件(如mqtt、kafka)等,不过各有优缺点,这个可以在日后进一步学习。



Tags:WebSocket   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
详解基于SpringBoot的WebSocket应用开发
在现代Web应用中,实时交互和数据推送的需求日益增长。WebSocket协议作为一种全双工通信协议,允许服务端与客户端之间建立持久性的连接,实现实时、双向的数据传输,极大地提升了用...【详细内容】
2024-01-30  Search: WebSocket  点击:(8)  评论:(0)  加入收藏
浅谈WebSocket协议在Web领域的应用
Part 01、WebSocket是什么? WebSocket是一种在Web应用程序中提供双向通信的协议。它允许服务器主动向客户端推送数据,而不是像传统的HTTP请求-响应模式一样,客户端必须发送请...【详细内容】
2023-12-08  Search: WebSocket  点击:(199)  评论:(0)  加入收藏
WebSocket基本使用方法
WebSocket是一种双向、单套接字连接,使用WebSocket,那么请求就变成了打开WebSocket连接的单一请求,并且可以重用公客户端到服务器以及服务器到客户端的同一连接。WebSock减少延...【详细内容】
2023-12-02  Search: WebSocket  点击:(186)  评论:(0)  加入收藏
你不知道的Websocket协议,这次给你讲明白!
前言初次接触 websocket 的人,可能都会有这样的疑问:我们已经有了 http 协议,为什么还需要websocket协议?它带来了什么好处?原因是http每次请求只能由客户发起,而websocket最大特...【详细内容】
2023-11-29  Search: WebSocket  点击:(193)  评论:(0)  加入收藏
实时协作的秘诀:RabbitMQ与WebSockets的结合
实时协作是现代软件开发中非常重要的一个方面。为了实现实时协作,一种常见的做法是将消息队列与WebSocket技术相结合。其中,RabbitMQ是一个功能强大的消息队列系统,它能够有效...【详细内容】
2023-11-21  Search: WebSocket  点击:(176)  评论:(0)  加入收藏
WebSocket 魔法师:打造实时应用的无限可能
1、背景 在开发一些前端页面的时候,总是能接收到这样的需求:如何保持页面并实现自动更新数据呢?以往的常规做法,是前端使用定时轮询后端接口,获取响应后重新渲染前端页面,这种做法...【详细内容】
2023-11-09  Search: WebSocket  点击:(197)  评论:(0)  加入收藏
什么是WebSocket ,一文了解
WebSocket 允许我们创建“实时”应用程序,与传统 API 协议相比,该应用程序速度更快且开销更少。一、WebSocket 是如何工作的按照传统的定义,WebSocket是一种双工协议,主要用于客...【详细内容】
2023-10-03  Search: WebSocket  点击:(148)  评论:(0)  加入收藏
实时数据推送并非只有WebSocket一种选择
环境:SpringBoot2.7.16概述在Web应用中,有几种实时数据推送的选择方案,包括SSE(Server-Sent Events)、WebSocket、长轮询等。SSE是一种基于HTTP协议的服务器向客户端推送数据的技...【详细内容】
2023-09-27  Search: WebSocket  点击:(405)  评论:(0)  加入收藏
SpringBoot使用WebSocket实现即时消息
当以jar包形式运行时需要配置该bean,暴露我们配置的@ServerEndpoint;当我们以war独立tomcat运行时不能配置该bean。这里有个g-messages.js文件是我写的一个工具类,用来做连接及...【详细内容】
2023-08-14  Search: WebSocket  点击:(253)  评论:(0)  加入收藏
SpringBoot整合WebSocket详解
环境:Springboot3.0.5WebSocket介绍WebSocket协议RFC 6455提供了一种标准化的方式,通过一个TCP连接在客户端和服务器之间建立全双工、双向的通信通道。它是一个不同于HTTP的TC...【详细内容】
2023-08-09  Search: WebSocket  点击:(369)  评论:(0)  加入收藏
▌简易百科推荐
学生偷看“不良网站”,手机上3个痕迹无法清除,网友:咋不早说
众所周知,中国的常规教育中,总是“谈性色变”,但在这个信息爆炸的互联网时代,即便是一些年纪很小的孩子,也能轻易接触到一些所谓的不良网站,因此这一方面的教育缺失,其实是很可怕的...【详细内容】
2024-03-28    叶姐生活指南  Tags:不良网站   点击:(11)  评论:(0)  加入收藏
什么是网络中的路由器?核心功能解释
路由器是互联网连接的核心元素,是一种允许多个设备连接到互联网,并促进将数据包转发到各自的目标地址的设备。使用动态路由技术,路由器检查数据并在各种可用路径中选择最有效的...【详细内容】
2024-03-07    千家网  Tags:路由器   点击:(31)  评论:(0)  加入收藏
过年该不该升级Wi-Fi 7路由?看完就知道
打开电商网站不难发现,从2023年第三季度到现在,Wi-Fi 7路由器新品越来越多。而且价格不再是高高在上,已经基本和Wi-Fi 6路由价格差不多了。看到这些Wi-Fi 7新品路由,不少朋友就...【详细内容】
2024-02-27    中关村在线  Tags:Wi-Fi   点击:(34)  评论:(0)  加入收藏
聊聊 Kubernetes 网络模型综合指南
这篇详细的博文探讨了 Kubernetes 网络的复杂性,提供了关于如何在容器化环境中确保高效和安全通信的见解。译自Navigating the Network: A Comprehensive Guide to Kubernete...【详细内容】
2024-02-19  云云众生s  微信公众号  Tags:Kubernetes   点击:(37)  评论:(0)  加入收藏
SSL协议是什么?关于SSL和TLS的常见问题解答
SSL(安全套接字层)及其后继者TLS(传输层安全)是用于在联网计算机之间建立经过身份验证和加密的链接的协议。尽管SSL协议在 1999年已经随着TLS 1.0的发布而被弃用,但我们仍将这些...【详细内容】
2024-02-06  IDC点评网    Tags:SSL协议   点击:(69)  评论:(0)  加入收藏
从零开始了解网络协议:TCP/IP详解
从零开始了解网络协议:TCP/IP详解 在当今数字化的时代,网络协议已经成为我们生活中不可或缺的一部分。作为互联网的基础,网络协议规定了数据如何在不同的网络设备之间传输。TC...【详细内容】
2024-02-01    简易百科  Tags:TCP/IP   点击:(59)  评论:(0)  加入收藏
BGP路由属性:互联网路由的灵活控制器
在互联网的庞大网络中,边界网关协议(BGP)是确保不同自治系统(AS)间路由信息有效交换的关键协议。然而,BGP的功能远不止于此。其核心组成部分,即BGP路由属性,赋予了BGP强大的灵活性,使...【详细内容】
2024-01-26  诺诺爱生活    Tags:互联网路由   点击:(40)  评论:(0)  加入收藏
简易百科之什么是网络延迟?
简易百科之什么是网络延迟?随着互联网的普及和发展,网络已经成为我们生活中不可或缺的一部分。然而,我们在使用网络时可能会遇到一种情况,那就是网络延迟。那么,什么是网络延迟呢...【详细内容】
2024-01-24    简易百科  Tags:网络延迟   点击:(143)  评论:(0)  加入收藏
网络延迟与网络速度有什么区别?分享具体的答案
通常,许多人抱怨网速测试。速度还是不错的,但是他们玩游戏的时候怎么会卡住,还是断开连接等等问题,这一系列问题始终困扰着大家。那么,网络延迟与网络速度有什么区别呢?请不要担心...【详细内容】
2024-01-24  萌新小郭    Tags:网络延迟   点击:(48)  评论:(0)  加入收藏
揭秘IP地址的网络威胁与攻击类型
在当今数字化时代,网络攻击已经成为网络安全的一大挑战。IP地址,作为互联网通信的基础,也成为网络威胁和攻击的焦点之一。本文将深入探讨不同类型的网络威胁和攻击,以及如何防范...【详细内容】
2024-01-22  IP数据云    Tags:IP地址   点击:(74)  评论:(0)  加入收藏
站内最新
站内热门
站内头条