践踏WebSocket:已建立连接,但在通道上未接收到消息,可能与JavaScript更相关

snz8szmq  于 12个月前  发布在  Java
关注(0)|答案(1)|浏览(172)

我在客户端使用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
ar5n3qh5

ar5n3qh51#

在您的MessageMapping处理程序中,您的目的地前缀为/(即“/topic/greeting”)。你已经注册了"/topic", "/queue"作为broker endpoints,spring会在发送消息之前使用这个来验证目的地。由于topic/greeting与注册的路径不匹配,因此不会发送消息。注意:这在AbstractBrokerMessageHandler#checkDestinationPrefix中处理,SimpleBrokerMessageHandler继承了AbstractBrokerMessageHandler#checkDestinationPrefix
类似地,在JavaScript代码中,使用/app/greeting作为stomp消息目的地。

相关问题