Spring Boot 使用 WebSocket示例

Introduction to WebSocket with Spring Boot | SpringHowicon-default.png?t=M0H8https://springhow.com/spring-boot-websocket/

让我们看看如何将 WebSocket 支持添加到 Spring Boot 应用程序中。我们将尝试创建一个简单的聊天应用程序。请注意,此实现不使用 STOMP。

什么是 WebSocket?

WebSocket 协议有助于通过单个 TCP 连接在客户端和服务器之间建立全双工双向通信。该协议与 HTTP 不同,但通过 HTTP 工作以实现兼容性。

将 Websocket 支持添加到 Spring Boot

要添加 websocket 支持,您应该将以下依赖项添加到您的 spring boot 项目中。

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

请注意,我们将使用 web socket 的基本版本来提供公共群聊。

创建一个 WebSocket 处理程序

与许多协议一样,WebSocket 遵循客户端-服务器架构。在我们的例子中,浏览器上的 javascript 将充当客户端,而 Spring Boot 服务器将充当 WebSocket 服务器。

 
public class ChatMessageHandler extends TextWebSocketHandler {

    List<WebSocketSession> webSocketSessions = Collections.synchronizedList(new ArrayList<>());

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        super.afterConnectionEstablished(session);
        webSocketSessions.add(session);
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        super.afterConnectionClosed(session, status);
        webSocketSessions.remove(session);
    }

    @Override
    public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {

        super.handleMessage(session, message);
        for (WebSocketSession webSocketSession : webSocketSessions) {
            webSocketSession.sendMessage(message);
        }
    }

}

让我们部分地学习这门课。Web 套接字支持基于 TEXT 和 BINARY 的通信。在我们的例子中,我们使用TextWebSocketHandler来处理消息。这个类已经带有一个默认实现。但是我们希望接收消息并将它们发送到我们拥有的其他会话。

因此,每当有新客户端连接时,我们都会将它们存储在内存列表中。当客户端断开连接时,我们会将它们从列表中清除。当其中一个客户端发送消息时,我们可以将该消息转发到连接到我们的 Spring Boot 应用程序的所有其他 WebSocket 会话。

需要注意的是,这个实现是为了演示。此外,此示例尝试将每条消息广播给包括发件人在内的所有人。尽管这对于聊天应用程序来说可能是一个有效的案例,但您可能需要使用数据库来存储数据并在现实生活中以处理后的结果进行响应。

现在我们需要将此处理程序映射到客户端可以识别的路径。

WebSocket 的 Spring 配置

我们有我们的处理程序。但是 Spring 需要了解我们创建的处理程序。此外,spring boot 将负责 WebSocket 设置的某些配置。这是一个简单的配置类。像以前一样,让我们​​部分地学习这门课。

 
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) {
        webSocketHandlerRegistry.addHandler(new ChatMessageHandler(), "/chat");
    }

}

@Configuration注释引导 @Enable* 类型注释。在这种情况下,我们有@EnableWebSocket。此注释确保 WebSocket 的自动配置已完成。另外,请注意,我们正在使用registerWebSocketHandlers()方法将ChatMessageHandler映射到路径“/chat”

简单的 JavaScript Web 套接字客户端

完成服务器部分后,让我们转到客户端。每个现代浏览器都默认支持 WebSocket 协议。这是一个用于发送和接收消息的简单 HTML。

 
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script type="application/javascript">
        let ws;

        function connect() {
            ws = new WebSocket("ws://localhost:8080/chat");
            ws.onmessage = function (e) {
                printMessage(e.data);
            }
            document.getElementById("connectButton").disabled = true;
            document.getElementById("connectButton").value = "Connected";
            document.getElementById("name").disabled = true;
        }

        function printMessage(data) {
            let messages = document.getElementById("messages");
            let messageData = JSON.parse(data);
            let newMessage = document.createElement("div");
            newMessage.innerHTML = messageData.name + " : " + messageData.message;
            messages.appendChild(newMessage);
        }

        function sendToGroupChat() {
            let messageText = document.getElementById("message").value;
            document.getElementById("message").value="";
            let name = document.getElementById("name").value;
            let messageObject = {
                name: name,
                message: messageText
            }
            ws.send(JSON.stringify(messageObject))
        }
    </script>
</head>
<body>
<input type="text" id="name"><input id="connectButton" type="button" value="Connect" onclick="connect()">
<div id="messages"></div>
<input type="text" id="message">
<input type="button" value="send" onclick="sendToGroupChat()">
</body>
</html>

让我们分解一下。在 java 脚本中,您可以使用内置类型的WebSocket连接到 Web 套接字。这种类型需要一个“ws://”端点来连接到服务器。

一旦连接,我们可以使用sendonmessageonerroronopenonclose方法来处理连接的会话。在我们的例子中,我们使用onmessage事件来接收数据并将其显示在 HTML 页面上。同样,我们可以使用send方法向服务器发布消息。

Spring Boot WebSocket 实战

这是一个演示,解释了 websocket 如何实时工作。

 

如您所见,一旦连接到服务器,每个页面都会自行获取消息。这可以通过onmessage方法实现。另外,如果你进入 chrome 开发者工具的网络选项卡,你可以看到所有通过 WebSocket 连接发送和接收的消息。

概括

我们学习了如何使用 Spring Boot 和 JavaScript 编写一个简单的 WebSocket 服务器-客户端实现。请注意,WebSocket 仅适用于支持 WebSocket 的现代浏览器。查看支持 WebSocket 的浏览器列表以获取更多信息。

此外,在使用基本的 WebSocket 实现时也有一些缺点。例如,套接字连接将在页面刷新时重置。因此,您需要处理和识别每个客户端(通过有状态的方法)。正如我之前提到的,并非所有浏览器都支持 Web 套接字。这意味着您应该自己编写一个回退机制来避免那些与浏览器相关的问题。

重要的是,这个例子是在没有 STOMP 的情况下完成的。我们将在下一篇文章中介绍这一点。所以请继续关注。

上面提到的所有代码都可以在我们的GitHub 存储库中找到。随意结帐并自行运行该应用程序。

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 使用Java Spring BootWebSocket程序,可以使用如下步骤: 1. 创建一个Spring Boot项目,选择Web和Websocket模块; 2. 在项目中配置WebSocket服务器,这可以通过实现WebSocketConfigurer接口并重写registerWebSocketHandlers方法来完成; 3. 创建一个WebSocket消息处理类,实现WebSocketHandler接口,并重写其中的方法来处理WebSocket消息; 4. 在页面上使用JavaScript代码连接WebSocket服务器并发送和接收消息。 以上就是使用Java Spring Boot编写WebSocket程序的基本流程。具体实现过程中可能会有一些细节需要注意,请参考相关文档或教程。 ### 回答2: 使用Java Spring Boot编写WebSocket是一种实现实时双向通信的常见方式。下面简要介绍一下如何使用Java Spring Boot编写WebSocket: 1. 首先,确保已经添加了Spring BootWebSocket依赖项。这可以通过在Maven或Gradle配置文件中添加相应的依赖项来实现。 2. 创建一个WebSocket配置类。在此类中,使用@EnableWebSocket注解启用WebSocket,并继承WebSocketConfigurer接口。重写registerWebSocketHandlers方法,创建并配置WebSocket处理器和WebSocket拦截器。 3. 创建一个WebSocket处理器类。在此类中,扩展TextWebSocketHandler类,并重写handleTextMessage方法以处理客户端发送的消息。您可以在此方法中编写自定义逻辑以处理消息。 4. 在WebSocket配置类中,使用addHandler方法将WebSocket处理器添加为WebSocket的处理程序,并指定WebSocket的端点。可以通过重写configureMessageBroker方法来配置消息代理(可选)。 5. 在控制器或服务类中,使用@MessageMapping和@SendTo注解定义处理WebSocket消息的方法。在处理方法中,您可以处理传入的消息并返回要发送给客户端的消息。 6. 在前端页面中,使用JavaScript编写WebSocket客户端代码。使用WebSocket对象连接到WebSocket服务器,并通过send方法发送消息。您可以使用onmessage事件处理器处理从服务器接收到的消息。 7. 运行应用程序并通过浏览器访问前端页面。您将能够使用WebSocket与服务器进行实时双向通信。 这是一个基本的步骤和结构,用于使用Java Spring Boot编写WebSocket。根据您的需求,您可以根据自己的需求进行扩展和自定义。 ### 回答3: 使用Java Spring Boot编写WebSocket可以按照以下步骤进行: 1. 创建一个新的Spring Boot项目,并添加相关依赖。在pom.xml文件中添加spring-boot-starter-websocket依赖: ```xml <dependencies> <!-- 其他依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> </dependencies> ``` 2. 创建一个WebSocket处理器类,在该类中处理WebSocket的连接、消息发送和接收等操作。可以使用@Component注解将其作为一个Spring Bean进行管理。例如: ```java 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; import org.springframework.web.socket.handler.TextWebSocketHandler; @Component public class MyWebSocketHandler extends TextWebSocketHandler { @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { // WebSocket连接建立后的操作 // 可以在此保存会话信息,如将该会话加入到某个会话列表中 } @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { // 接收到WebSocket消息的操作 // 可以在此处理接收到的消息,并根据需要进行回复 String receivedMessage = message.getPayload(); // 处理消息并回复 session.sendMessage(new TextMessage("Received: " + receivedMessage)); } // 其他WebSocket操作的重写方法 } ``` 3. 创建一个WebSocket配置类,配置WebSocket的端点以及WebSocket处理器。可以使用@EnableWebSocket注解开启WebSocket支持,并重写registerWebSocketHandlers方法配置WebSocket处理器和端点。例如: ```java 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 { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(new MyWebSocketHandler(), "/websocket") .setAllowedOrigins("*"); // 允许跨域访问 } } ``` 4. 启动Spring Boot应用程序,WebSocket将注册/websocket端点以供客户端连接。客户端可以使用浏览器的WebSocket API或其他WebSocket客户端与服务器建立连接,并发送和接收WebSocket消息。 以上就是使用Java Spring Boot编写WebSocket的基本步骤,根据需要可以进一步修改和扩展WebSocket处理器以满足具体的业务需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值