SpringBoot整合websocket

发布时间:2023年12月17日

使用SpringBoot整合websocket,构建websocket通信工程

1.什么是websocket

WebSocket 是 HTML5 一种新的协议。它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯,它建立在 TCP 之上,同 HTTP 一样通过 TCP 来传输数据,但是它和 HTTP 最大不同是:
?

  • WebSocket 是一种双向通信协议,在建立连接后,WebSocket 服务器和 Browser/Client Agent 都能主动的向对方发送或接收数据,就像 Socket 一样;
  • WebSocket 需要类似 TCP 的客户端和服务器端通过握手连接,连接成功后才能相互通信。

2.如何引入websocket

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
            <version>2.0.0.RELEASE</version>
        </dependency>

3.编写websocket配置类

@Component
@EnableWebSocket
public class WebSoketConfig implements WebSocketConfigurer, ServletContextInitializer {
    @Bean
    public ServerEndpointExporter serverEndpointExporter(){
        return new ServerEndpointExporter();
    }


    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler( new TestWebSocketHandler(), "/test").setAllowedOrigins("*");
    }

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        servletContext.addListener(WebAppRootListener.class);
        servletContext.setInitParameter("org.apache.tomcat.websocket.textBufferSize","131072");//128KB
        servletContext.setInitParameter("org.apache.tomcat.websocket.binaryBufferSize","131072");//128KB
    }

}

其中,ServerEndpointExporter是Spring官方提供的标准实现,用于扫描ServerEndpointConfig配置类和ServerEndpoint注解实例。

  • 使用内置Tomcat容器部署,必须用@Bean注入ServerEndpointExporter
  • 使用外置容器部署war包,不需要使用@Bean注入ServerEndpointExporter
registerWebSocketHandlers是将Handle绑定在某个 URL 上,或者说监听某个 URL。也就是在spring容器中注册一个handler地址,后续会配置这个handler,实现具体逻辑。

onStartup函数是为了配置websocket的传输数据大小,默认为8k。

4.编写handler

@Component
@Slf4j
public class TestWebSocketHandler extends TextWebSocketHandler {

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        log.info("WebSocket连接已建立: ");
    }

    @Override
    public void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
//业务逻辑
session.sendMessage(new TextMessage("Hello"));
}

    }

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

    @Override
    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
        log.error("WebSocket错误: " + exception);
    }
}

当客户端与WebSocket服务器建立连接时,会调用afterConnectionEstablished函数。该函数在连接建立后被执行,你可以在这里进行一些初始化操作或记录连接信息。

handleTextMessage函数用于处理客户端发送的文本消息。当收到客户端发送的消息时,该函数会被调用。

afterConnectionClosed函数在WebSocket连接关闭后被调用。在该函数中,你可以进行一些资源释放或记录连接关闭信息的操作。

handleTransportError函数是处理WebSocket传输错误的回调函数。当发生传输错误时,例如网络断开等情况,该函数会被调用。在该函数中,你可以记录错误信息或进行相应的错误处理。

文章来源:https://blog.csdn.net/gzu_01/article/details/134944618
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。