当前位置: 首页 > 知识库问答 >
问题:

spring websockets未接收数据

钱选
2023-03-14

我正在尝试spring websockets,由于某些原因我不明白,我可以建立与服务器的连接,但当我发送数据时什么也没有发生。

下面是我的配置类(与其他spring websocket示例完全相同):

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketsConfig extends AbstractWebSocketMessageBrokerConfigurer {

@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
    config.enableSimpleBroker("/topic");
    config.setApplicationDestinationPrefixes("/app");
}

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
     registry.addEndpoint("/ws").withSockJS();
}

}

我的控制器,在一个包中,我确保spring inicialites它,因为我用@PostConstruct注释说明init()消息。如您所见,我编写了system.out.println以便在控制台中查看该方法是否触发,但这种情况从未发生,因此数据从未到达控制器:

@Controller
public class MonitorSpring {

@PostConstruct
protected void init() {
    System.out.println("init()");
}

@MessageMapping("/sendmessage")
@SendTo("/topic/message")
public ChatMessage sendMessage(@Payload ChatMessage chatMessage) {
    System.out.println("sendMessage here");
    return chatMessage;
}

@MessageMapping("/adduser")
@SendTo("/topic/user")
public ChatMessage addUser(@Payload ChatMessage chatMessage, SimpMessageHeaderAccessor headerAccessor) {
    System.out.println("addUser here");
    headerAccessor.getSessionAttributes().put("username", chatMessage.getSender());
    return chatMessage;
}

}

最后是我的JavaScript客户机,我将在这里简单地把重要的部分放在这里:

function connect(event) {
    username = document.querySelector('#name').value.trim();

    if(username) {
        usernamePage.classList.add('hidden');
        chatPage.classList.remove('hidden');

        var socket = new SockJS('https://' + document.location.host + '/ws');
        stompClient = Stomp.over(socket);

        stompClient.connect({}, onConnected, onError);
    }
    event.preventDefault();
}


function onConnected() {
    stompClient.subscribe('/topic/message', onMessageReceived);
    stompClient.subscribe('/topic/user', onMessageReceived);
    stompClient.send("/app/adduser", {}, JSON.stringify({sender: username, type: 'JOIN'}))

    connectingElement.classList.add('hidden');
}

function sendMessage(event) {
    var messageContent = messageInput.value.trim();
    if (messageContent && stompClient) {
        var chatMessage = {
            sender: username,
            content: messageInput.value,
            type: 'CHAT'
        };
        stompClient.send("/app/sendmessage", {}, JSON.stringify(chatMessage));
        messageInput.value = '';
    }
    event.preventDefault();
}

我确实连接并创建了websocket,没有任何问题,但是当我向服务器发送一些东西时,我会在chrome控制台中看到这条消息,但服务器上什么也没有发生:

>>> SEND
destination:/app/sendmessage
content-length:53

{"sender":"user1","content":"message1","type":"CHAT"}

我会做错什么?

共有2个答案

公良征
2023-03-14

不确定是否有人还在面对这些问题。

对未来的任何人来说

除了Tovidiu的答案之外,您还应该允许跨原点头

Registry.AddEndPoint(“/ws”).SetAllowedOrigins(“*”).WithSockJs();

舒永嘉
2023-03-14

首先,您应该实现WebSocketMessageBrokerConfigureer而不是AbstractWebSocketMessageBrokerConfigureer,因为这是不推荐使用的。

当您连接到websocket时

 var socket = new SockJS('https://' + document.location.host + '/ws');

您应该连接到http端点

 var socket = new SockJS('http://' + document.location.host + '/ws');

如果您试图向https发送消息,但没有配置证书,它可能会拒绝您的消息。

 类似资料:
  • 我想知道过去2天在这里和那里。我的问题是,我正在使用多部分/表单数据发送多个文件,其中包含一些文本/纯字段。问题是,当我使用发送数据时,它工作正常,但是当我尝试使用发送数据时,服务器没有收到任何东西,下面是我的, 下面是方法,我是如何使用这个类的, 下面是我ASP的一面, 请帮我解决这个问题…!!!提前感谢。

  • 所有这些似乎都运行良好,但cliend在身份验证后发送的数据似乎没有收到,只有3个字节设置为0。 我希望套接字在程序的生存期内保持打开状态,因此我不能处理流,因为这样也会处理套接字。 这里是客户端和服务器端的完整代码,希望有人能看到我的错误,或者我错过了一个问题。

  • 我有一个简单的api fetch,它返回一个我想要插入到输入中的数字。我正在使用Document.getElementById(#id).InnerHTML。我可以通过console.log看到该值,但它没有显示在输入中。

  • 通知广播接收机: 谁能帮帮我吗?我不知道我做错了什么

  • 使用eventmachine gem,我试图在本地主机上发送和接收数据。以下是我的客户端和服务器文件的代码。 服务器铷 客户铷 我在单独的控制台中执行服务器和客户端文件。以下是客户端的输出 客户端输出 服务器输出 在服务器文件中,我已经打印了收到的数据,但它显示“.................. 谢啦

  • 这是我第一次尝试进行基本身份验证,但似乎没有任何效果。Axios post未发送数据/控制器未返回响应。我找不到我到底哪里出错了,但我想知道我的http post请求的主体是否必须与requestbody匹配,或者我需要做什么更改才能让UserRepository将表单dat保存在数据库中? }