自己尝试着搭建Springboot聊天室的项目,后台websocket配置如下
@Configuration
@EnableWebSocketMessageBroker //允许stomp协议
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer{
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/stomp") //添加STOMP协议的端点。// 这个URL是供WebSocket客户端或SockJS客户端连接服务端访问的地址。
.setAllowedOrigins("*").addInterceptors(new HttpSessionHandshakeInterceptor()). //添加允许跨域访问
withSockJS(); //指定端点使用SockJS协议
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.setApplicationDestinationPrefixes("/topic,/queue") //服务器推送给客户端的前缀
.enableSimpleBroker("/app"); //客户端发送给服务端的前缀
}
}
消息接收类的代码如下
@Controller
public class MessageController {
@MessageMapping("/test")
@SendTo("/topic/hhh")
public String sendMessage(Map<String,Object> map){
return "miao";
}
}
理论上前台应该发送消息到/api/test时Controller类应该能接收到消息,但是发送消息后未能进入controller类
html就不贴了,js前端代码如下
window.onload=function(){
var sockJs=new SockJS("/stomp");
var stomp=Stomp.over(sockJs);
stomp.connect({},function (frame) {
console.log(frame);
stomp.subscribe("/topic/hhh",function (data) {
console.log(data)
});
})
document.getElementById("sendMesssage").onclick=function () {
console.log(stomp.connected);
var message=document.getElementById("talkMessage");
stomp.send("/app/test",{},JSON.stringify({"message":message}));
}
}
连接完成时frame的控制台日志打印如下
Frame {command: "CONNECTED", headers: {…}, body: ""}
body: ""
command: "CONNECTED"
headers:
heart-beat: "0,0"
version: "1.1"
proto: Object
proto: Object
send时并没有断开连接,为啥发送不到对应地址?