详解WebSocket

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

目录

1.WebSocket是什么?

2.WebSocket的通信过程

3.WebSocket的报文结构

4.JAVA中的WebSocket


1.WebSocket是什么?

在传统的BS体系中,请求响应一直是单向的,服务器一直扮演的”被动“的角色,浏览器发起请求去访问服务器,服务器才会返回响应。这种单向的模式让实时通信、消息推送一类的场景,实现起来成本巨大。

HTML5里面提出了WebSocket标准,目的就是让服务器具有”主动“的能力,能由服务器向浏览器主动推送东西。WebSocket 是一种基于 TCP 协议的应用层协议,它允许客户端和服务器之间建立持久连接,实现实时通信和推送功能,其和HTTP属于并列的关系:

详解WebSocket,JAVA EE,网络,java,websocket,原力计划 

2.WebSocket的通信过程

详解WebSocket,JAVA EE,网络,java,websocket,原力计划

WebSocket的通信分为两个阶段:

  • 握手阶段

  • 数据交换阶段

握手阶段:

  • 客户端通过 HTTP 请求发起握手请求,请求头包含一些特殊的字段,如pgrade: websocket和 Connection: Upgrade,以及其他的 WebSocket 相关字段。

  • 服务器响应握手:服务器收到客户端的 WebSocket 握手请求后,进行协议升级,将 HTTP 连接升级为 WebSocket 连接。服务器返回一个 WebSocket 握手响应,响应头中包含特殊字段,如 Upgrade: websocketConnection: Upgrade,以及其他的 WebSocket 相关字段。

  • 连接建立:一旦客户端收到服务器的 WebSocket 握手响应,WebSocket 连接就建立成功,现在客户端和服务器都可以发送和接收 WebSocket 消息了。

数据交换阶段:

  • 双向数据交换:WebSocket 连接建立后,客户端和服务器可以通过 WebSocket 会话进行双向的数据交换。任何一方都可以随时发送消息给对方,而不需要事先发出请求。这使得客户端和服务器能够实时交流和传输数据。

  • 数据帧:WebSocket 使用数据帧(Frame)来传输数据。数据帧是 WebSocket 数据的最小传输单元。数据帧可以被分割成多个片段来传输更大的数据。数据帧中包含了有效载荷(Payload)和一些控制信息,例如标识消息类型、是否为最后一个片段等。

  • 心跳检测:WebSocket 连接建立后,客户端和服务器可以通过发送心跳数据帧来维持连接。心跳检测可以确保连接的持久性,如果在一段时间内没有收到心跳响应,可以判断连接已断开。

3.WebSocket的报文结构

详解WebSocket,JAVA EE,网络,java,websocket,原力计划

websocket的报文=结束标志位 + 操作码 + 帧长度 + 掩码

  • 第一位“FIN”:相当于 HTTP/2 里的“END_STREAM”,表示数据发送完毕。一个消息可以拆成多个帧,接收方看到“FIN”后,就可以把前面的帧拼起来,组成完整的消息。

  • “FIN”后面的三个位是保留位,目前没有任何意义,但必须是 0。

  • “Opcode”,操作码:其实就是帧类型,比如 1 表示帧内容是纯文本,2 表示帧内容是二进制数据,8 是关闭连接,9 和 10 分别是连接保活的 PING 和 PONG。

  • 掩码标志位“MASK”:表示帧内容是否使用异或操作(xor)做简单的加密。目前的 WebSocket 标准规定,客户端发送数据必须使用掩码,而服务器发送则必须不使用掩码。

  • “Payload len”:表示帧内容的长度。它是另一种变长编码,最少 7 位,最多是 7+64 位,也就是额外增加 8 个字节,所以一个 WebSocket 帧最大是 2^64。

  • “Masking-key”:掩码密钥,它是由上面的标志位“MASK”决定的,如果使用掩码就是 4 个字节的随机数,否则就不存在。

4.JAVA中的WebSocket

WebSocket作为一个HTML5标准,也就是前端提出的标准,后端服务器需要支持这种标准,也就是能准确解析WebSocket的数据包,按照约定的标准来办事儿,才能使用WebSocket。

Java 的 Servlet 3.1 规范中包含了对 WebSocket 的支持,也就是说支持Servlet 3.1的Web Server就支持WebSocket。实际开发中常用的tomcat、netty都支持websocket。

这里给出Spring Boot中使用WebSocket的demo。其底层是用的TomCat支持的WebSocket标准。

依赖:

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

websocket处理器:

每一个 WebSocket 连接对应一个 WebSocketSession。当客户端通过 WebSocket 建立连接时,服务器会为每个连接创建一个 WebSocketSession 对象,用于表示该连接的会话信息。

处理器用于处理WebSocketSession。

import org.springframework.stereotype.Component;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.WebSocketMessage;
import org.springframework.web.socket.WebSocketSession;

@Component
public class MyWebSocketHandler implements WebSocketHandler {

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        System.out.println("WebSocket 连接建立:" + session.getId());
    }

    @Override
    public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
        String payload = message.getPayload().toString();
        System.out.println("接收到消息:" + payload);
        session.sendMessage(new TextMessage("服务器收到消息:" + payload));
    }

    @Override
    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
        System.err.println("WebSocket 传输错误:" + session.getId());
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
        System.out.println("WebSocket 连接关闭:" + session.getId());
    }

    @Override
    public boolean supportsPartialMessages() {
        return false;
    }
}

配置、注册websocket处理器:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Autowired
    private MyWebSocketHandler webSocketHandler;

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(webSocketHandler, "/ws").setAllowedOrigins("*");
    }
}

前端代码示例:文章来源地址https://www.toymoban.com/news/detail-623708.html

<!DOCTYPE html>
<html>
<head>
    <title>WebSocket Test</title>
</head>
<body>
    <button onclick="sendMessage()">发送消息</button>
    <div id="messageBox"></div>

    <script>
        const ws = new WebSocket('ws://localhost:8080/ws');

        ws.onopen = function(event) {
            console.log('WebSocket 已连接');
        };

        ws.onmessage = function(event) {
            document.getElementById('messageBox').innerHTML += '<p>' + event.data + '</p>';
        };

        ws.onclose = function(event) {
            console.log('WebSocket 已关闭');
        };

        function sendMessage() {
            const message = prompt('请输入要发送的消息:');
            ws.send(message);
        }
    </script>
</body>
</html>

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

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

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

相关文章

  • Java Websocket 01: 原生模式 Websocket 基础通信

    Java Websocket 01: 原生模式 Websocket 基础通信 Java Websocket 02: 原生模式通过 Websocket 传输文件 原生模式下 服务端通过 @ServerEndpoint 实现其对应的 @OnOpen, @OnClose, @OnMessage, @OnError 方法 客户端创建 WebSocketClient 实现对应的 onOpen(), onClose(), onMessage(), onError() 完整示例代码 https://github.com/

    2024年02月09日
    浏览(29)
  • 什么是 WebSocket?Java 中如何实现 WebSocket?

    WebSocket 是一种新型的网络协议,它允许客户端和服务器之间进行双向通信,可以实现实时数据交互。WebSocket 协议是基于 HTTP 协议的,使用标准的 TCP 连接,可以在客户端和服务器之间建立一条持久化的连接,而不需要像 HTTP 协议那样每次请求都需要重新建立连接。 WebSocket 协

    2024年02月16日
    浏览(33)
  • Java Websocket 02: 原生模式通过 Websocket 传输文件

    Java Websocket 01: 原生模式 Websocket 基础通信 Java Websocket 02: 原生模式通过 Websocket 传输文件 关于 Websocket 传输的消息类型, 允许的参数包括以下三类 以下类型之一, 同时只能出现一个 文本类型 (text messages) 的消息: String, Java primitive, 阻塞的 Stream Reader, 带text decoder(Decoder.Text or Deco

    2024年02月09日
    浏览(47)
  • c# websocket client java websocket server

    实现功能:c# websocket 客户端 连接 java websocket 服务端 一,c# websocket 客户端  nuget websocketsharp-netstandard Program.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using WebSocketSharp;  //websocketsharp-netstandard namespace websocketCli

    2024年02月16日
    浏览(27)
  • 【Java EE】-JavaScript详解

    作者 :学Java的冬瓜 博客主页 :☀冬瓜的主页🌙 专栏 :【JavaEE】 分享 : 且视他人如盏盏鬼火,大胆地去走你的道路。——史铁生《病隙碎笔》 主要内容 :HTML中引入JS的三种方式。JS语法分析,JS是动态弱类型语言,JS中的数组、方法、对象。JSWebAPI学习,选中元素和单击事

    2023年04月25日
    浏览(28)
  • 两种实现WebSocket的方式,基于Java实现WebSocket。

    首先我们声明WebSocker方便打字为ws。 WebSocker ws = new WebSocket(); 或者说启用spring框架,因为spring已经整合了ws。 配置类:把spring中的ServerEndpointEx porter对象注入进来 用iava注解来 @ServerEndpoint          监听连接、 @OnOpen          连接成功、 @OnClose        连接关闭、 @

    2024年01月21日
    浏览(34)
  • Android程序中使用websocket通信(java-websocket)

    使用场景: 需要和硬件保持实时通信 为什么用websocket: 在以前的消息推送机制中,用的都是http轮询(polling),做一个定时器定时向服务器发送请求,这种方式是非常消耗资源的,因为它本质还是http请求,而且显得非常笨拙。而WebSocket 在浏览器和服务器完成一个握手的动作

    2024年01月23日
    浏览(38)
  • websocket基于java实现

    随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了。近年来,随着HTML5的诞生,WebSocket协议被提出, 它实现了浏览器与服务器的全双工通信,扩展了浏览器与服务端的通信功能,使服务端也能主动向客户端发送数据 。 我们知道,传统的HTTP协议是无状态

    2024年02月06日
    浏览(39)
  • 【Java使用WebSocket步骤】

    在项目中需要用到与前端进行双向通信,遂选择了Java API for WebSocket(JSR 356): WebSocket是一种在Web浏览器和服务器之间进行双向通信的技术,可以使得浏览器与服务器之间建立长连接,并且实现实时数据传输。在Java中,可以使用Java API for WebSocket(JSR 356)实现WebSocket通信。

    2023年04月18日
    浏览(25)
  • Java集成WebSocket

    WebSocket协议是基于TCP的一种新的网络协议。它实现了客户端与服务器全双工通信。而HTTP是单工通信,通信只能由客户端发起,客户端请求一下,服务器处理一下,这就太麻烦了。于是websocket应运而生。 WebSocket是类似客户端服务端的形式(采用ws协议),那么这里的WebSocketServer其

    2024年02月15日
    浏览(20)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包