Spring Boot WebSocket Server无法连接问题求助(Unity客户端)
问题解决与路径说明
先明确你配置里的路径作用
/topic/public:这是STOMP协议的订阅主题,当服务器通过@SendTo指定这个路径时,所有订阅了该主题的STOMP客户端都会收到消息。/sendMessage:结合配置里的setApplicationDestinationPrefixes("/app"),客户端需要通过STOMP协议发送消息到/app/sendMessage,服务器的@MessageMapping("/sendMessage")会处理这个请求,再把结果转发到/topic/public。
连接失败的核心原因
你Unity用的是原生WebSocket,但当前Spring Boot配置的是STOMP协议的WebSocket服务,两者协议不匹配:原生WebSocket只传输纯文本/二进制数据,而STOMP要求客户端发送符合其格式的帧(比如CONNECT、SEND指令),所以直接连接会失败。
适配原生WebSocket的解决方案
如果你要和普通Java服务端的WebSocket逻辑一致,实现基础聊天并在控制台看消息,需要改用Spring Boot的原生WebSocket实现:
1. 移除原STOMP配置类
删掉你原来的WebSocketConfig(带@EnableWebSocketMessageBroker的那个),换成原生WebSocket的配置:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.server.standard.ServerEndpointExporter; @Configuration public class WebSocketConfig { @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } }
2. 编写原生WebSocket服务端类
这个类负责处理客户端的连接、消息接收:
import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.Session; import javax.websocket.server.ServerEndpoint; import org.springframework.stereotype.Component; @ServerEndpoint("/ws") @Component public class ChatWebSocketServer { // 客户端连接成功时触发 @OnOpen public void onOpen(Session session) { System.out.println("客户端[" + session.getId() + "]已连接"); } // 收到客户端消息时触发 @OnMessage public void onMessage(String message, Session session) { // 控制台打印收到的消息 System.out.println("收到客户端[" + session.getId() + "]的消息: " + message); // 可选:回复消息给当前客户端 try { session.getBasicRemote().sendText("服务器已收到: " + message); } catch (Exception e) { e.printStackTrace(); } } }
3. Unity端代码无需修改
你原来的Unity连接代码ws = new WebSocket("ws://localhost:8887/ws");完全适配这个原生WebSocket服务,发送消息后就能在Spring Boot控制台看到内容。
内容的提问来源于stack exchange,提问作者egepancaroglu
相关产品推荐
相关产品推荐

