基於註解的websocket
WebSocket 通信流程 ws:// 開頭 Upgrade:websocket Connection:upgrade 狀態碼:101協議變更 websocket沒有同源限制。
1. 服務終端類:
用java註解來監聽連接端點:@ServerEndpoint、 連接成功@OnOpen、連接關閉@OnClose、收到消息等狀態 @OnMessage
package com.ruoyi.websocket.java;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 監聽websocket地址/myWs
*/
@ServerEndpoint("/myWs")
@Component
@Slf4j
public class WsServerEndponit {
static Map<String, Session> sessionMap=new ConcurrentHashMap<>();
//連接建立執行的操作
@OnOpen
public void OnOpen(Session session){
sessionMap.put(session.getId(),session);
log.info("websocket is open");
}
//收到了客戶端消息執行的操作
@OnMessage
public String OnMessage(String text){
log.info("websocket is OnMessage");
log.info("revice a message"+text);
return "revice a message";
}
//連接關閉是執行的操作
@OnClose
public void OnClose(Session session){
sessionMap.remove(session.getId());
log.info("websocket is close");
}
//每2秒向客戶端發送消息
@Scheduled(fixedRate = 2000)
public void sendMsg() throws IOException {
for (String key:sessionMap.keySet()){
sessionMap.get(key).getBasicRemote().sendText("心跳測試");
}
log.info("websocket send message");
}
}
2. 配置類:
把spring中的ServerEndpointExporter對象注入進來
package com.ruoyi.websocket.java;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@Configuration
public class WebSocketConfig {
//若依框架引用websocket serverEndpointExporter引入不了包
//https://blog.csdn.net/weixin_43737919/article/details/125760457
@Bean
public ServerEndpointExporter serverEndpointExporter(){
return new ServerEndpointExporter();
}
}
html5demo:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>websocketdemo</title>
<meta name="description" content="">
<meta name="keywords" content="">
<link href="" rel="stylesheet">
</head>
<body>
<script type="text/javascript">
let ws=new WebSocket("ws://localhost:8080/myWs");
ws.onopen+function(){
ws.send("hello")
}
ws.onmessage=function (message){
console.log(message.data)
}
</script>
</body>
</html>