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保存起来。
原文地址:https://www.cnblogs.com/KanHin/p/10529480.html
时间: 2024-11-04 04:49:23