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+",不在线!");
}
}
}