webSocket 傳送訊息給客戶端
阿新 • • 發佈:2022-05-04
- 在配置websocket代理時使用simpleBroker(簡單代理),就不需要使用訊息伺服器,簡單向前端傳送訊息:
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/client");
}
- @SendTo 註解可以將訊息傳送給所有訂閱此地址的客戶端;如果不需要將訊息發給所有的使用者,則可以使用@SendToUser,(如果一個使用者在多個瀏覽器登陸,則會將訊息發給所有客戶端,如果不需要傳送給所有的,可以設定broadcast=false)
@MessageMapping("/send") @SendToUser(destinations = "/client", broadcast = false) public String ws(Principal principal, String msg) { // 客戶端訂閱的地址是 /user/client // 服務端@SendToUser傳送的代理地址是 /client, 地址將會被轉化為 /user/{username}/client System.out.println(principal); System.out.println(msg); return msg; }
- 如果服務端要將訊息傳送給特定的某一個使用者,可以使用SimpleMessageTemplate的convertAndSendToUser方法(第一個引數是使用者的登陸名username)
@MessageMapping("/send") // @SendToUser(destinations = "/client", broadcast = false) public void ws(Principal principal, String msg) { // 客戶端訂閱的地址是 /user/client // 服務端@SendToUser傳送的代理地址是 /client, 地址將會被轉化為 /user/{username}/client System.out.println(principal); System.out.println(msg); simpMessagingTemplate.convertAndSendToUser("yawn1", "/client", msg); }
- 客戶端訂閱程式碼
var socket = new SockJS("/socket");
var stomp = Stomp.over(socket);
stomp.connect("guest", "guest", function(frame){
stomp.subscribe("/user/client", function (message) {
$(".content").html(message.body);
})
});
- 客戶端傳送程式碼(客戶端傳送的地址可以是服務端@MessageMappring設定的地址,也可以是配置的代理地址,後者可以直接將訊息傳送給訂閱者)
$(".send").click(function () {
stomp.send("/server/send", {}, $(".msg").val());
});