- 在配置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()); });