springboot集成websocket

Posted kanhin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot集成websocket相关的知识,希望对你有一定的参考价值。

websocket是全双工通信协议,目前html5支持,如果是app端的话可能不支持,建议app端实现通过tcp握手长连接实现通信,这里暂不研究。

首先websocket是一个协议,需要了解一下

 

第一步先引入starter

1 <dependency>
2             <groupId>org.springframework.boot</groupId>
3             <artifactId>spring-boot-starter-websocket</artifactId>
4             <version>${websocket.version}</version>
5         </dependency>

 

 

编写一个websocket终端类

 

 1 @ServerEndpoint(value = "/websocket")
 2 @Component
 3 public class FinePetroWebSocket {
 4 
 5     private static ApplicationContext applicationContext;
 6 
 7     public static void setApplicationContext(ApplicationContext context) {
 8         applicationContext = context;
 9     }
10 
11     /**
12      * concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
13      */
14     private static CopyOnWriteArraySet<FinePetroWebSocket> webSocketSet = new CopyOnWriteArraySet<>();
15 
16     /**
17      * 与某个客户端的连接会话,需要通过它来给客户端发送数据
18      */
19     private Session session;
20 
21     /**
22      * 存储session的map 
23      */
24     private static Map<String, Session> sessionMap = new ConcurrentHashMap<>();
25 
26    
27 
28 
29     /**
30      * 连接建立成功调用的方法
31      */
32     @OnOpen
33     public void onOpen(Session session) {
34         this.session = session;
35         //加入set中
36         webSocketSet.add(this);
37 
38 
39     }
40 
41     /**
42      * 连接关闭调用的方法
43      */
44     @OnClose
45     public void onClose() {
46         //从set中删除
47         webSocketSet.remove(this);
48     }
49 
50     /**
51      * 收到客户端消息后调用的方法
52      *
53      * @param message 客户端发送过来的消息
54      */
55     @OnMessage
56     public void onMessage(String message, Session session) {
57        
58        
59     }
60 
61     private void sendMessage(Session session, String message) throws IOException {
62         session.getBasicRemote().sendText(message);
63     }
64 
65     
66    
67 
68 
69 }

 

1 @Configuration
2 public class WebSocketConfig {
3     @Bean
4     public ServerEndpointExporter serverEndpointExporter() {
5         return new ServerEndpointExporter();
6     }
7 
8 }

 

 

 

 

这样就可以实现通讯了 , 但是注意这里的一个坑就是websocket每个链接使用一个对象,这里就不算是单例的,所以注入的service会为null,所以要使用static静态变量,在application中调用。

@Component默认是单例模式的,但springboot还是会为每个websocket连接初始化一个bean,所以可以用一个静态set保存起来。

 

以上是关于springboot集成websocket的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot之集成WebSocket

springboot 集成 websocket

Springboot+vue3集成使用WebSocket

将 Java WebSockets (JSR-356) 与 SpringBoot 集成

springboot集成websocket

SpringBoot——SpringBoot集成WebSocket实现简单的多人聊天室