• Websocket在Java中的实践——最小可行案例


    WebSocket是一种先进的网络通信协议,它允许在单个TCP连接上进行全双工通信,即数据可以在同一时间双向流动。WebSocket由IETF标准化为RFC 6455,并且已被W3C定义为JavaScript API的标准,成为现代浏览器的重要特性之一。
    WebSocket的引入彻底改变了传统的Web应用交互模式。在WebSocket之前,Web应用通常使用HTTP协议进行通信,但由于HTTP是一个无状态的、请求-响应模式的协议,它无法满足实时、双向通信的需求。WebSocket的出现,解决了这一问题,它使得Web应用能够像桌面应用一样,实现低延迟、高频率的数据交换。
    WebSocket的核心特性包括:

    • 全双工通信:WebSocket允许客户端和服务器之间进行双向通信,数据可以在同一时间双向流动。这意味着服务器可以主动向客户端推送数据,而无需等待客户端发起请求。
    • 长连接:WebSocket连接一旦建立,就会保持打开状态,直到显式关闭。这种长连接特性减少了频繁建立和销毁连接的开销,提高了通信效率。
    • 轻量级头部:WebSocket数据帧采用紧凑的二进制格式,减少了不必要的头部信息,提高了数据传输效率。
    • 实时性:由于数据可以直接在已建立的连接上传输,WebSocket能够实现实时或接近实时的数据交互。
    • 跨域支持:与HTTP一样,WebSocket也允许跨域通信,只需服务器端设置相应的CORS(跨源资源共享)头即可。

    通过本系列学习,我们会缩减《RabbitMQ实践——搭建多人聊天服务》一文中的接口,在一个连接上实现消息的收发。

    最小可行案例

    依赖

    在pom.xml中新增

    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-websocketartifactId>
    dependency>
    

    开启Websocket,绑定路由

    src\main\java\com\nyctlc\front\config\WebSocketConfig.java

    package com.nyctlc.front.config;
    
    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;
    
    import com.nyctlc.front.handler.WebSocketHandler;
    
    @Configuration
    @EnableWebSocket
    public class WebSocketConfig implements WebSocketConfigurer {
    
        @Override
        public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
            registry.addHandler(new WebSocketHandler(), "/websocket").setAllowedOrigins("*");
        }
    }
    

    @EnableWebSocket 是 Spring Boot 中的一个注解,它主要用于启用对 WebSocket 的支持。
    我们通过WebSocketHandlerRegistry的addHandler方法,将/websocket接口的处理逻辑交由自定义的WebSocketHandler类处理;同时使用setAllowedOrigins来表示接受所有的域过来的请求。

    逻辑类

    src\main\java\com\nyctlc\front\handler\WebSocketHandler.java

    package com.nyctlc.front.handler;
    
    import org.springframework.web.socket.TextMessage;
    import org.springframework.web.socket.WebSocketSession;
    import org.springframework.web.socket.handler.TextWebSocketHandler;
    
    import java.io.IOException;
    import java.util.HashSet;
    import java.util.Set;
    
    public class WebSocketHandler extends TextWebSocketHandler {
    
        private static Set<WebSocketSession> sessions = new HashSet<>();
    
        @Override
        public void afterConnectionEstablished(WebSocketSession session) throws Exception {
            sessions.add(session);
        }
    
        @Override
        protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
            for (WebSocketSession webSocketSession : sessions) {
                if (webSocketSession.isOpen()) {
                    try {
                        webSocketSession.sendMessage(message);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    

    当连接建立后,afterConnectionEstablished会被调用,我们将连接保存到sessions集合中。这一步主要是为了后续给各个连接发送请求用。
    handleTextMessage表示收到了请求,然后会遍历所有连接,并会对处于Open状态的连接发送收到的消息。这儿就是收发放在一起了。

    测试

    我在网页中用JS做了各种测试,会发现遇到很多问题。后来索性采用Postman来测试,亲测可行且稳定。
    在这里插入图片描述

    填入我们绑定的地址:ws://localhost:8080/websocket
    在这里插入图片描述
    下图可见连接上了
    在这里插入图片描述
    我们发送一条hello
    在这里插入图片描述
    可以看到接受到了服务端的反馈
    在这里插入图片描述

    参考资料

  • 相关阅读:
    内容 总结
    40道JAVA经典算法面试题(答案)
    二、Rocketmq-dashboard的web管理页面部署
    6、相机标定中的特殊棋盘格检测方法(真是啥需求都会有)
    流媒体协议之RTSP详解
    candence出现no connect property onpin,,,,错误,该怎么办?
    问题记录 springboot 事务方法中使用this调用其它方法
    SCI投稿:投稿附言cover letter的写法和模板!
    HTTP2指纹识别(一种相对不为人知的网络指纹识别方法)
    内存地址解码(Dram Address Decoding)
  • 原文地址:https://blog.csdn.net/breaksoftware/article/details/139889881