美文网首页
websocket练习

websocket练习

作者: 明天也是奋斗鸭 | 来源:发表于2019-04-18 00:07 被阅读0次

    1.首先新建模块:

    <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-websocket</artifactId>
    </dependency>
    
    
    • 或者在创建模块的时候按顺序点击添加:

      image

    2.建立config、controller包:

    image

    3.WebSocketConfig、WebSocketServer、WebSocketController:

    • WebSocketConfig
      import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.Configuration;
      import org.springframework.web.socket.server.standard.ServerEndpointExporter;
      
      /**
       * WebSocket的配置类
       * 开启了WebSocket支持
       */
      @Configuration
      public class WebSocketConfig {
      
          @Bean
          public ServerEndpointExporter serverEndpointExporter() {
              return new ServerEndpointExporter();
          }
      }
      
      
    • WebSocketServer
      import org.springframework.stereotype.Component;
      import javax.websocket.*;
      import javax.websocket.server.ServerEndpoint;
      import java.io.IOException;
      import java.util.concurrent.CopyOnWriteArraySet;
      
      //客户端向服务器端建立WebSocket连接的url
      @ServerEndpoint("/websocket")
      @Component
      public class WebSocketServer {
      
          //静态变量,用来记录当前在线连接数,可选
          private static int onlineCount = 0;
      
          //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象,必须
          private static CopyOnWriteArraySet<WebSocketServer> webSocketSet
            = new CopyOnWriteArraySet<WebSocketServer>();
      
          //与某个客户端的连接会话,需要通过它来给客户端发送数据,必须
          private Session session;
      
          /**
           * 连接建立成功调用的方法
           */
          @OnOpen
          public void onOpen(Session session) {
              this.session = session;
              webSocketSet.add(this);     //将客户端加入set中
              addOnlineCount();           //在线数加1
              System.out.println("有新窗口开始监听,当前在线人数为"
                      + getOnlineCount());
              try {
                  sendMessage("连接成功");
              } catch (IOException e) {
                  System.out.println("WebSocket IO异常");
              }
          }
      
          /**
           * 连接关闭调用的方法
           */
          @OnClose
          public void onClose() {
              webSocketSet.remove(this);  //从set中删除
              subOnlineCount();           //在线数减1
              System.out.println("有连接关闭!当前在线人数为" + getOnlineCount());
          }
      
          /**
           * 收到客户端消息后调用的方法
           *
           * @param message 客户端发送过来的消息
           */
          @OnMessage
          public void onMessage(String message, Session session) {
              System.out.println("收到客户端的信息:" + message);
              //群发消息
              for (WebSocketServer item : webSocketSet) {
                  try {
                      item.sendMessage(message);
                  } catch (IOException e) {
                     e.printStackTrace();
                  }
              }
          }
      
          /**
           * @param session
           * @param error
           */
          @OnError
          public void onError(Session session, Throwable error) {
              System.out.println("发生错误");
              error.printStackTrace();
          }
      
          /**
           * 实现服务器主动推送
           */
          public void sendMessage(String message) throws IOException {
              this.session.getBasicRemote().sendText(message);
          }
          /**
           * 群发自定义消息
           */
          public static void sendInfo(String message) throws IOException {
              System.out.println("推送消息内容:" + message);
              for (WebSocketServer item : webSocketSet) {
                  try {
                      item.sendMessage(message);
                  } catch (IOException e) {
                      continue;
                  }
              }
          }
      
         public static synchronized int getOnlineCount() {
              return onlineCount;
          }
      
          public static synchronized void addOnlineCount() {
              WebSocketServer.onlineCount++;
          }
      
          public static synchronized void subOnlineCount() {
              WebSocketServer.onlineCount--;
          }
      }
      
      
    • WebSocketController
      import com.soft1721.websocket.config.WebSocketServer;
      import org.springframework.web.bind.annotation.GetMapping;
      import org.springframework.web.bind.annotation.RestController;
      
      import java.io.IOException;
      
      @RestController
      public class WebSocketController {
      
          //推送数据接口
          @GetMapping("/socket/push")
          public String pushMsg(String message) {
              try {
                  WebSocketServer.sendInfo(message);
              } catch (IOException e) {
                  e.printStackTrace();
              }
              return "success";
          }
      }
      
      

    4.接下来主方法WebsocketApplication

    5.运行Swagger查看结果

    相关文章

      网友评论

          本文标题:websocket练习

          本文链接:https://www.haomeiwen.com/subject/bhsawqtx.html