赞
踩
文章目录
本文将在Spring boot框架下,创建一个web项目来实现WebSocket服务器的功能。
项目是基于spring boot框架构建的,导入其中的WebSocket自动装配依赖
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-websocket</artifactId>
- <version>2.7.3</version>
- </dependency>
在创建WebSocket服务类之前,需要为其编写一个配置类,配置类中使用@Bean注解将ServerEndpointExporter 对象,也就是服务端点导出器对象交给IOC容器管理,这又这样,spring boot web工程才能识别WebSocket服务类。
- package com.example.websocket;
-
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.web.socket.server.standard.ServerEndpointExporter;
-
- /**
- * WebSocket配置类,用于注册WebSocket的Bean
- */
- @Configuration
- public class WebSocketConfiguration {
-
- @Bean
- public ServerEndpointExporter serverEndpointExporter() {
- return new ServerEndpointExporter();
- }
-
- }
创建服务类只需要打上两个注解。
注解一:@Component 表示该类是IOC容器的组件,将该类交给IOC容器管理。
注解二:@ServerEndpoint 表示该类是WebSocket的服务类,参数为访问时的映射地址。
- /**
- * WebSocket服务
- */
- @Component
- @ServerEndpoint("/webSocketServer")
- public class WebSocketServer {
-
- }
WebSocket中有4个事件分别是open、message、error、close,他们也对应着4个注解。
3.2.1 @OnOpen
表示连接成功时使用的方法。可以在方法参数上接收一个会话对象,让每一个建立连接的客户端都保存起来,方便后期往客户端发送数据。
- //存放会话对象
- private static List<Session> sessionList = new ArrayList<>();
-
- @OnOpen
- public void onOpen(Session session) {
- System.out.println("客户端建立连接");
- sessionList.add(session);
- }
3.2.2 @OnMessage
收到客户端发来消息时执行的方法。这里自定义了一个群发消息的方法,用于个所有连接的客户端发送消息。通过之前保存的会话对象的getBasicRemote()方法来获取一个远程服务端点对象,然后使用这个对象的sendText方法发送一个字符串对象个客户端。
通过使用getBasicRemote()获取的对象来发送信息,最主要的原因是其特点是阻塞式发送信息。
还可以使用getAsyncRemote()获取对象来发送信息,其特点是异步式发送。
-
- /**
- * 收到客户端消息后调用的方法
- *
- * @param message 客户端发送过来的消息
- */
- @OnMessage
- public void onMessage(String message) {
- System.out.println("收到来自客户端的信息:" + message);
- sendToAllClient(message);
- }
-
- /**
- * 群发
- *
- * @param message 需要发送的信息
- */
- public void sendToAllClient(String message) {
- for (Session session : sessionList) {
- try {
- //服务器向客户端发送消息
- //getBasicRemote()方法是获取一个远程服务端点对象,通过该对象进行阻塞式的信息传输
- session.getBasicRemote().sendText(message);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
3.2.3 @OnError
连接出错时调用的方法
- @OnError
- public void OnError() {
- System.out.println("连接出错");
- }
3.2.3 @OnClose
连接关闭时调用的方法
- @OnError
- public void OnError() {
- System.out.println("连接出错");
- }
- package com.example.websocket;
-
- import org.springframework.stereotype.Component;
-
- import javax.websocket.*;
- import javax.websocket.server.PathParam;
- import javax.websocket.server.ServerEndpoint;
- import java.util.*;
-
- /**
- * WebSocket服务
- */
- @Component
- @ServerEndpoint("/webSocketServer")
- public class WebSocketServer {
-
- //存放会话对象
- private static List<Session> sessionList = new ArrayList<>();
-
- /**
- * 连接建立成功调用的方法
- */
- @OnOpen
- public void onOpen(Session session) {
- System.out.println("客户端建立连接");
- sessionList.add(session);
- }
-
- /**
- * 收到客户端消息后调用的方法
- *
- * @param message 客户端发送过来的消息
- */
- @OnMessage
- public void onMessage(String message) {
- System.out.println("收到来自客户端的信息:" + message);
- sendToAllClient(message);
- }
-
- /**
- * 群发
- *
- * @param message 需要发送的信息
- */
- public void sendToAllClient(String message) {
- for (Session session : sessionList) {
- try {
- //服务器向客户端发送消息
- //getBasicRemote()方法是获取一个远程服务端点对象,通过该对象进行阻塞式的信息传输
- session.getBasicRemote().sendText(message);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
-
- /**
- * 连接关闭调用的方法
- */
- @OnClose
- public void onClose() {
- System.out.println("连接断开");
- }
-
- /**
- * 连接出错调用的方法
- */
- @OnError
- public void OnError() {
- System.out.println("连接出错");
- }
-
- }
WebSocket服务端的实现已经完成,文中的服务端可以结合 WebSocket案例(一) 客户端_C.J.Y的博客-CSDN博客 中的客户端进行测试,只需要将编写客户端的html文件加入到项目中的src/main/resources/statis目录下(如下图),然后启动项目,访问localhost:8080/文件名.html 即可进行页面测试。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。