java - spring websocket 无法建立连接
问题描述
无法通过浏览器客户端与我的 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");
}
}
和控制器:
@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
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 socket 的信息。
推荐阅读
- xaml - 绑定 ContentView 的 BindingContext 不会更新里面的控件
- r - 相应地使用用户输入更改闪亮的 GUI
- java - 我们可以在没有临时文件的情况下在 java 中创建文件/zipfile 作为 InputStream
- r - 我如何在情节上比较 Kolmogorov 和 Lilieforce 测试?
- c# - Internet 速度低时运行程序的问题 (SQL Server CE)
- neural-network - 如何使用神经网络求解 PDE?
- html - Primer 与 Bootstrap 兼容吗?
- python-3.x - 如何使用 Helm Kafka Chart 和 Python pod 发布大型(5 兆字节)消息
- oracle - unixODBC - 无法加载 easysoft libodbc.a(libodbc.so.1)
- javascript - 为什么我的 HTML 模板会附加到同一个 DIV 容器中?