当前位置:   article > 正文

JAVA实现websocket_websocket java

websocket java

@ServerEndpoint注解是一个类层次的注解,它的功能主要是将目前的类定义成一个websocket服务器端,
注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端

首先 maven中加入

  1.         <dependency>
  2.             <groupId>org.springframework.boot</groupId>
  3.             <artifactId>spring-boot-starter-websocket</artifactId>
  4.         </dependency>

WebSocket java代码

  1. @Component
  2. @ServerEndpoint(value = "/websocket/{username}")
  3. public class WebSocket {
  4.     private static final Logger log = LoggerFactory.getLogger(WebSocket.class);
  5.     
  6.     public static int onlineCount = 0;  
  7.     public static Map<String, WebSocket> clients = new HashMap<String, WebSocket>();
  8.     public Session session;  
  9.     public String  username;  
  10.     public String getUsername() {
  11.         return username;
  12.     }
  13.     @OnOpen  
  14.     public void onOpen(@PathParam("username") String username, Session session) throws IOException { 
  15.         this.username = username;  
  16.         this.session = session;  
  17.         addOnlineCount();  
  18.         clients.put(session.getId(), this);  
  19.         log.warn("已连接:"+username);  
  20.     }  
  21.   
  22.     @OnClose  
  23.     public void onClose() throws IOException {  
  24.         log.warn("断开"+username);
  25.         clients.remove(session.getId());  
  26.         subOnlineCount();  
  27.     }  
  28.   
  29.     //收到客户端消息后调用的方法
  30.     @OnMessage  
  31.     public void onMessage(String message) throws IOException {   
  32.         if(message.equals("ping")) {
  33.             this.session.getAsyncRemote().sendText("pang");  
  34.         }else if("close".equals(message)) {
  35.             onClose();
  36.             this.session.close();
  37.         }else {
  38.             log.warn(this.username+"收到 "+message);
  39.         }
  40.     }
  41.     @OnError  
  42.     public void onError(Session session, Throwable error) {  
  43.         error.printStackTrace();  
  44.     }
  45.     
  46.     public static void sendMessageTo(JSONObject json) {  
  47.         log.warn("sendMsg:"+json);
  48.         for (WebSocket item : clients.values()) {
  49.             item.session.getAsyncRemote().sendText(json.toJSONString());  
  50.         }
  51.     }
  52.     
  53.     public static void clearMessageFromOpen(String message) {
  54.         try {
  55.             JSONObject json = JSONObject.parseObject(message);
  56.             if(json.get("uuid") != null) {
  57.             }
  58.         } catch (Exception e) {
  59.         }
  60.     }
  61.     
  62.   
  63.     public static synchronized int getOnlineCount() {  
  64.         return onlineCount;  
  65.     }  
  66.   
  67.     public static synchronized void addOnlineCount() {  
  68.         WebSocket.onlineCount++;  
  69.     }  
  70.   
  71.     public static synchronized void subOnlineCount() {  
  72.         WebSocket.onlineCount--;  
  73.     }  
  74.   
  75.     public static synchronized Map<String, WebSocket> getClients() {  
  76.         return clients;  
  77.     } 
  78.     
  79. }

在RunApplication中加入

  1.    /**
  2.      * 会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint
  3.      * 要注意,如果使用独立的servlet容器,
  4.      * 而不是直接使用springboot的内置容器,
  5.      * 就不要注入ServerEndpointExporter,因为它将由容器自己提供和管理。
  6.      */
  7.     @Bean
  8.     public ServerEndpointExporter serverEndpointExporter() {
  9.       return new ServerEndpointExporter();
  10.     }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/249166
推荐阅读
相关标签
  

闽ICP备14008679号