SpringBoot 使用WebSocket

news/2024/10/21 12:00:13

WebSocket 是一种网络通信协议,提供了在单个TCP连接上进行全双工通信的能力。这意味着客户端和服务器可以同时发送和接收数据,而不需要等待对方的回应。
Spring Boot 提供了对WebSocket的自动配置和简化的编程模型,使得在Spring Boot应用程序中集成WebSocket变得相对简单。

需要引入依赖

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

创建socket配置文件

package com.ggp.test1017.config;import com.ggp.test1017.controller.ServerController;
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 {@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {registry.addHandler(new ServerController(), "/websocket").setAllowedOrigins("*");}public ServerController serverController() {return new ServerController();}
}

创建客户端配置

package com.ggp.test1017.controller;import javax.websocket.*;
import java.io.IOException;
import java.net.URI;@ClientEndpoint
public class ClientController {private Session session;private static volatile boolean isConnected = false;@OnOpenpublic void onOpen(Session session) {System.out.println("WebSocket 连接已经建立。");this.session = session;isConnected = true;}@OnMessagepublic void onMessage(String message, Session session) {
//        打印在客户端System.out.println(message);}@OnClosepublic void onClose() {System.out.println("WebSocket 连接已经关闭。");isConnected = false;}@OnErrorpublic void onError(Throwable t) {System.out.println("WebSocket 连接出现错误:" + t.getMessage());}public void connect(String url) throws Exception {WebSocketContainer container = ContainerProvider.getWebSocketContainer();container.connectToServer(this, new URI(url));}public void send(String message) throws IOException {if (isConnected) {session.getBasicRemote().sendText(message);} else {System.out.println("WebSocket 连接未建立,无法发送消息。");}}public void close() throws IOException {if (session != null) {session.close();}}// 添加一个方法来检查连接是否已经建立public boolean isIsConnected() {return isConnected;}
}

创建一个服务端配置

package com.ggp.test1017.controller;import org.springframework.web.socket.*;import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;@ServerEndpoint("/websocket")
public class ServerController implements WebSocketHandler {private static final Set<WebSocketSession> sessions = Collections.synchronizedSet(new HashSet<WebSocketSession>());@Overridepublic void afterConnectionEstablished(WebSocketSession session) throws Exception {sessions.add(session);System.out.println("有新连接加入,当前连接数:" + sessions.size());}@Overridepublic void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {String payload = message.getPayload().toString();System.out.println("收到来自 " + session.getId() + "的客户端信息: " + payload);// 将消息发送给所有客户端for (WebSocketSession s : sessions) {if (s.isOpen()) {s.sendMessage(new TextMessage("服务器收到信息。(已读) " + payload));}}System.out.println("服务器收到信息!(已读) " + payload);}@Overridepublic void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {System.out.println("传输错误:" + exception.getMessage());}@Overridepublic void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {sessions.remove(session);System.out.println("连接关闭,当前连接数:" + sessions.size());}@Overridepublic boolean supportsPartialMessages() {return false;}
}

测试

启动服务 Application

创建模拟客户端

package com.ggp.test1017.controller;import javax.websocket.ContainerProvider;
import javax.websocket.WebSocketContainer;
import java.net.URI;public class ClientDemo01 {public static void main(String[] args) throws Exception {ClientController client = new ClientController();String url = "ws://localhost:8080/websocket"; // 假设这是你的服务端WebSocket URL// 建立连接client.connect(url);// 发送消息client.send("666");System.out.println("66");// 等待连接建立Thread.sleep(500);client.close();}
}

运行demo,结果会在服务端控制台看到。

客户端界面显示

服务端界面显示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/74120.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Leetcode 1584. 连接所有点的最小费用

1.题目基本信息 1.1.题目描述 给你一个points 数组,表示 2D 平面上的一些点,其中 points[i] = [x_i, y_i] 。 连接点 [x_i, y_i] 和点 [x_j, y_j] 的费用为它们之间的 曼哈顿距离 :|x_i – x_j| + |y_i – y_j| ,其中 |val| 表示 val 的绝对值。 请你返回将所有点连接的最小…

Linux系统MySQL安装

Linux系统安装MySQL1.下载安装包 官方网站:https://www.mysql.com/ ,找到下载DOWNLOADS,下载操作系统对应的社区版本。本文使用的数据库版本是5.7.41。在社区版本下载界面可以下载最新和以前的版本。2、安装MySQL 2.1、查看是否已经安装MySQL rpm -qa | grep mysql mysql-li…

宝塔面板如何进行反向代理的配置

反向代理在网络架构中充当重要角色,帮助改善网站性能、安全性并提供额外的配置选项。在宝塔面板中实施反向代理配置,涉及的步骤包括:1. 安装并启动必要的软件;2. 配置代理规则以指向目标服务器;3. 优化性能和安全性设置;4. 对配置进行测试验证。在操作中,我们将详细探讨…

Linux模块

ansible-doc -l:查看ansible系统的模块 ansible-doc 加模块名 :具体查看那个模块 ansible-doc -s 加模块名 :具体查看那个模块 ansible重要常用模块命令模块:command shell script文件模块:file copy安装模块:yum服务模块:service定时模块:cron挂载模块:mount…

Python中的深拷贝与浅拷贝

目录1. 可变对象和不可变对象2. 用=赋值的问题3. copy模块登场4. 重新认识列表对象5. 浅拷贝,深拷贝浅拷贝(copy.copy())一维列表的浅拷贝深拷贝(copy.deepcopy())浅拷贝,深拷贝,直接赋值的区别 1. 可变对象和不可变对象 在 Python 中,数据类型可以分为两大类:可变对象和…