![](/img/trans.png)
[英]Spring 4.0 WebSocket example-application: Fails to establish websocket connection
[英]spring websocket cannot establish connection
無法通過瀏覽器客戶端與我的 websocket 服務器建立連接。
配置:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic/", "/queue/");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/greeting");
}
}
和 controller:
@MessageMapping("/message")
@SendToUser("/queue/reply")
public String processMessageFromClient(@Payload String message, Principal principal) throws Exception {
String name = new Gson().fromJson(message, Map.class).get("name").toString();
System.out.println(name);
//messagingTemplate.convertAndSendToUser(principal.getName(), "/queue/reply", name);
return name;
}
我啟動服務器,然后在瀏覽器中打開 index.html 然后連接到ws://localhost:8080/greeting
然后發送消息到/app/message
但實際上什么也沒發生。 瀏覽器檢查器顯示 404。我怎么了?
這是在 Spring 中實現 WebSocket 的方法。首先,您應該配置 Web 套接字消息代理並注冊 stomp 端點,如下所示。 在這里,我使用 setAllowedOrigins("*").withSockJS() 將此端點訪問到任何主機。
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/greeting")
.setAllowedOrigins("*")
.withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.setApplicationDestinationPrefixes("/app")
.enableSimpleBroker("/topic", "/queue/");
}
}
然后我創建 controller,如下所示。
@Controller
public class WebSocketController {
private final SimpMessagingTemplate template;
@Autowired
WebSocketController(SimpMessagingTemplate template){
this.template = template;
}
@MessageMapping("/queue/reply")
public void sendMessage(String message){
System.out.println(message);
this.template.convertAndSend("/topic", message);
}
}
使用@MessageMapping("/queue/reply") 而不是上面的@SendToUser("/queue/reply")。
從那個簡單的消息傳遞模板,我使用 convertAndSend() 方法與那個消息代理進行異步數據通信。 如果有任何數據到達該消息代理,它將使用上面配置的名為 /socket 的端點與 SockJS 和 Stomp 自動發送該數據。
您可以參考本文了解更多關於 Spring web 插座的信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.