X86客户端的又一个需求。。

写惯了接口都不知道该怎么主动推送数据了。。

Websocket,一种在单个 TCP 连接上进行全双工通讯的协议。也就是说,它允许服务端主动向客户端推送数据。并且只需要一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。

简单说,就是服务器可以主动推送数据到浏览器客户端,客户端也可以请求数据。

那就实现一下⑧:
首先,依赖包是必须的

<dependency>  
           <groupId>org.springframework.boot</groupId>  
           <artifactId>spring-boot-starter-websocket</artifactId>  
       </dependency>

注解也是必须加的
@ServerEndpoint("/server/{clientId}")
@Component

@ServerEndpoint("/server/{clientId}")
@Component
@Slf4j
public class WebSocketServer {

    private static int onlineCount = 0;
    
    /**线程安全,存放每个客户端对应的WebSocket对象。*/
    private static ConcurrentHashMap<String,WebSocketServer> webSocketMap = new ConcurrentHashMap<>();
    /**客户端ID*/
    private String clientId;
    /**连接会话*/
    private Session session;

    /**
     * 连接建立成功调用的方法
     *
      */
    @OnOpen
    public void onOpen(Session session,@PathParam("userId") String userId) {
		//连接成功要干啥就干啥
        }
    }

    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose() {
	      //连接关闭后要干啥就干啥
    }

     //收到客户端消息后调用  
    public void onMessage(String message, Session session) {
       //这里根据客户端(HTML)发送的啥消息,返回啥数据
       switch(message){
       		case "要干啥":
       			//给你啥
       			break;
       }
    }

    @OnError
    public void onError(Session session, Throwable error) {
        //出错了,持久化异常?
    }
    
    /**
     * 实现服务器主动推送
     */
    public void sendMessage(String message) throws IOException {
        this.session.getBasicRemote().sendText(message);
    }


    public static void sendInfo(String message,@PathParam("clientId") String clientId) throws IOException {
        log.info("发送消息到:"+clientId+",报文:"+message);
        if(StringUtils.isNotBlank(clientId)&&webSocketMap.containsKey(clientId)){
            webSocketMap.get(clientId).sendMessage(message);
        }else{
            log.error("用户"+clientId+",不在线!");
        }
    }
    
}