Spring boot + Websocket
阿新 • • 發佈:2019-03-28
pub 聲明 print contex hpa wired http point hello 1、添加配置類
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.server.standard.ServerEndpointExporter; @Configuration public class WebSocketConfig { /** * 註入ServerEndpointExporter, * 這個bean會自動註冊使用了@ServerEndpoint註解聲明的Websocket endpoint */ @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } }
2、添加WebSocket類
import org.slf4j.Logger; import org.slf4j.LoggerFactory; 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.PathParam; import javax.websocket.server.ServerEndpoint; import java.util.HashMap; import java.util.Map; import java.util.concurrent.CopyOnWriteArraySet; @Component @ServerEndpoint("/websocket/{shopId}") public class WebSocket { private static Logger logger = LoggerFactory.getLogger(WebSocket.class); private Session session; private static CopyOnWriteArraySet<WebSocket> webSockets = new CopyOnWriteArraySet<>(); private static Map<String, Session> sessionPool = new HashMap<>(); @OnOpen public void onOpen(Session session, @PathParam(value = "shopId") String shopId) { this.session = session; webSockets.add(this); sessionPool.put(shopId, session); logger.info("有新的連接,總數為:{}", webSockets.size()); } @OnClose public void onClose() { webSockets.remove(this); logger.info("連接斷開,總數為:{}", webSockets.size()); } @OnMessage public void onMessage(String message) { logger.info("收到客戶端消息:{}", message); } // 此為廣播消息 public void sendAllMessage(String message) { for (WebSocket webSocket : webSockets) { System.out.println("【websocket消息】廣播消息:" + message); try { webSocket.session.getAsyncRemote().sendText(message); } catch (Exception e) { logger.error("", e); } } } // 此為單點消息 public void sendOneMessage(String shopId, String message) { Session session = sessionPool.get(shopId); if (session != null) { try { session.getAsyncRemote().sendText(message); } catch (Exception e) { logger.error("", e); } } } }
3、添加測試類
import com.sgcc.gtfsamservice.componet.WebSocket; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("api") public class TestController { @Autowired private WebSocket webSocket; @RequestMapping("/sendAllWebSocket") public String test() { webSocket.sendAllMessage("hello"); return "多發!"; } @RequestMapping("/sendOneWebSocket") public String sendOneWebSocket() { webSocket.sendOneMessage("channel001", "hello!"); return "單發"; } }
4、前端Vue
export default {
name: ‘relationship‘,
data () {
return {
}
},
created () { // 頁面創建生命周期函數
this.initWebSocket()
},
destroyed: function () { // 離開頁面生命周期函數
this.websocketclose()
},
methods: {
initWebSocket: function () {
// ws等同http,wss等同https,其中ip為後端應用主機,port為後端啟動所占用的端口
this.websock = new WebSocket(‘ws://ip:port/websocket/channel001‘)
this.websock.onopen = this.websocketonopen
this.websock.onerror = this.websocketonerror
this.websock.onmessage = this.websocketonmessage
this.websock.onclose = this.websocketclose
},
websocketonopen: function () {
console.log(‘WebSocket連接成功‘)
},
websocketonerror: function (e) {
console.log(‘WebSocket連接發生錯誤‘)
},
websocketonmessage: function (e) {
var da = JSON.parse(e.data)
console.log(da)
this.message = da
},
websocketclose: function (e) {
console.log(‘connection closed (‘ + e.code + ‘)‘)
},
Spring boot + Websocket