我在客户端使用WebSocket和SockJs实现聊天,在服务器上使用spring-WebSocket,我已经建立了连接,但当我发送消息时,它永远不会到达服务器-或者它看起来是基于处理方法缺乏日志。看起来客户端(和编码器:P)在这里有错,但我不能发现错误。
客户端:
import Stomp from 'stompjs';
...
function connect() {
var socket = new WebSocket('ws://localhost:8080/chat', "v10.stomp");
stompClient = Stomp.over(socket);
stompClient.connect({}, function(frame) {
setConnected(true);
console.log('Connected: ' + frame);
stompClient.subscribe('/topic/greeting', function(messageOutput) {
console.log(messageOutput.body);
showMessageOutput(JSON.parse(messageOutput.body));
});
});
}
function sendMessage() {
let message = JSON.stringify({"from":"User1", "messageBody":"Connected", "to":''});
console.log(message);
stompClient.send("app/greeting", {}, message); // tried to change destination to topic/greeting - with no positive results
}
...
客户端package.json依赖:
"devDependencies": {
"css-loader": "^6.7.2",
"postcss-loader": "^7.0.2",
"sass": "^1.56.1",
"sass-loader": "^13.2.0",
"style-loader": "^3.3.1",
"webpack": "^5.75.0",
"webpack-cli": "^5.0.1",
"webpack-dev-server": "^4.11.1"
},
"main": "webpack.config.js",
"description": "",
"dependencies": {
"bootstrap": "^5.2.3",
"html-webpack-plugin": "^5.5.0",
"jquery": "^3.6.1",
"net": "^1.0.2",
"sockjs-client": "^1.6.1",
"stomp-websocket": "^2.3.4-next",
"stompjs": "^2.3.3",
"websocket": "^1.0.34"
}
服务器:
@RequiredArgsConstructor
@Controller
@Slf4j
class WebSocketController {
private static final Map<String, String> userToSessionMap = new ConcurrentHashMap<>();
SimpMessagingTemplate simpMessagingTemplate;
@MessageMapping("/greeting")
public void addUserAndNotifyOthers(@Header("simpSessionId") String sessionId, @Payload Message initialMessage) {
userToSessionMap.put(initialMessage.getFrom(), sessionId);
log.warn(initialMessage.toString()); // THIS LOG IS NEVER DISPLAYED
simpMessagingTemplate.convertAndSend("topic/greeting", initialMessage);
}
...
}
@Data
@AllArgsConstructor
public class Message {
String to;
String from;
String messageBody;
}
@Configuration
@EnableWebSocketMessageBroker
public class WebsocketConfiguration implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/chat").setAllowedOrigins("http://localhost:5000");
registry.addEndpoint("/chat").setAllowedOrigins("http://localhost:5000").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic", "/queue");
registry.setApplicationDestinationPrefixes("/app");
}
}
日志
Web Socket Opened... stomp.js:134:104
>>> CONNECT
accept-version:1.1,1.0
heart-beat:10000,10000
� stomp.js:134:104
<<< CONNECTED
version:1.1
heart-beat:0,0
� stomp.js:134:104
connected to server undefined stomp.js:134:104
Connected: CONNECTED
heart-beat:0,0
version:1.1
index.js:32:17
>>> SUBSCRIBE
id:sub-0
destination:/topic/greeting
� stomp.js:134:104
SENDING: {"from":"User1","messageBody":"Connected","to":""} index.js:54:13
>>> SEND
destination:topic/greeting
content-length:50
{"from":"User1","messageBody":"Connected","to":""}�
// END OF LOGS: I never get Received log
1条答案
按热度按时间ar5n3qh51#
在您的MessageMapping处理程序中,您的目的地前缀为
/
(即“/topic/greeting”)。你已经注册了"/topic", "/queue"
作为broker endpoints,spring会在发送消息之前使用这个来验证目的地。由于topic/greeting
与注册的路径不匹配,因此不会发送消息。注意:这在AbstractBrokerMessageHandler#checkDestinationPrefix
中处理,SimpleBrokerMessageHandler
继承了AbstractBrokerMessageHandler#checkDestinationPrefix
类似地,在JavaScript代码中,使用
/app/greeting
作为stomp消息目的地。