Okhttp WebSocket预期HTTP 101响应,但在spring Boot 服务器上为“400”

njthzxwz  于 2023-08-05  发布在  Spring
关注(0)|答案(1)|浏览(448)

我正在开发一个带有Sping Boot 服务器的Android应用。
因此,我使用OkHttp打开了一个WebSocket连接,从我的Android应用程序连接到使用Stomp的Sping Boot 服务器。
当WebSocket连接因服务器中抛出的某些异常而关闭时,我尝试重新连接,但收到Expected HTTP 101 response but was '400 '错误。
出于测试目的,我在Android应用程序向服务器发送SEND帧时抛出了一个异常。
这个测试是这样的
1.发送WebSocket升级请求
1.打开WebSocket连接后,发送CONNECT Stomp请求
1.然后,发送SUBSCRIBE Stomp请求以订阅队列
1.然后,在SEND Stomp Frame中发送一条消息,然后服务器抛出一个异常
1.服务器将响应ERROR Stomp帧并关闭WebSocket连接。
1.我尝试通过执行步骤1-3重新连接
下面是用于测试的代码。
当我第一次启动我的Android应用程序时,它向服务器发送WebSocket请求,如下所示。我编造了IP地址,但在我的真实的应用程序中,我使用了正确的IP地址。

val webSocketRequest = Request.Builder().url("199.166.1.100:8081/websocket").build()
socket = okHttpClient.newWebSocket(webSocketRequest, this)

字符串
WebSocket请求如下所示

Request{method=GET, url=http://199.166.1.100:8081/websocket, tags={}}


然后,服务器发送以下响应并调用onOpen()函数,这意味着握手工作正常。

Response{protocol=http/1.1, code=101, message=, url=http://199.166.1.100:8081/websocket}


在onOpen()函数中,我向服务器发送一个Stomp CONNECT请求,服务器响应CONNECTED,然后我向队列发送SUBSCRIBE请求。到目前为止,一切正常。
我已经在StompMessageBorker中添加了一个拦截器,以便为SEND请求抛出异常,如下所示

public Message<?> preSend(Message<?> message, @NonNull MessageChannel channel) {
        StompHeaderAccessor stompHeaderAccessor = StompHeaderAccessor.wrap(message);
        StompCommand stompCommand = stompHeaderAccessor.getCommand();
        
        if (StompCommand.SEND.equals(stompCommand))
            throw new RuntimeException();

        return message;
    }


因此,我在SEND Stomp帧中发送一条消息,当RuntimeException被抛出时,服务器向Android应用程序发送ERROR Stomp帧或响应,并调用OkHttp Websocket的onClosing()和onClosed()函数,这意味着WebSocket连接被关闭。
这里是问题,WebSocket连接关闭后,我尝试用以下函数重新连接WebSocket,基本上经历了相同的过程,发送CONNECT请求,然后是SUBSCRIBE请求。

override suspend fun reconnect() {
    socket?.close(1000, null)
    val webSocketRequest = Request.Builder().url("199.166.1.100:8081/websocket").build()
    socket = okHttpClient.newWebSocket(webSocketRequest, this)
    
}


但是我得到了Expected HTTP 101 response but was '400 ',甚至onOpen()函数也没有被调用,我想握手可能有一些问题。
我在做这个测试的时候注意到了几件事。
1.前三到四个重新连接请求按预期工作,onOpen()函数被调用,我也可以订阅队列。但是在3或4次之后,我开始得到这个错误Expected HTTP 101 response but was '400 ',从那时起,每个重新连接请求都得到了同样的错误。
1.一旦我得到这个Expected HTTP 101 response but was '400 ',重启我的Spring Boot服务器没有帮助,但如果重新启动我的Android应用程序,那么我可以连接WebSocket.但是,在发送一个抛出异常的消息触发了3或4次断开连接后,我最终得到了同样的错误。
你们对这个问题有什么想法吗?还是我做错了什么
我如何才能在3或4次断开连接后建立WebSocket连接?
先谢了。
=-期刊题录与文摘内容
我已经添加了一个HandshakeInterceptor,以查看beforeHandshake()中是否存在问题。
很明显,当我得到101响应时,调用了beforeHandshake()

Response{protocol=http/1.1, code=101, message=, url=http://199.166.1.100:8081/websocket}


但是,当我得到400个响应时

Expected HTTP 101 response but was '400 '


根本不调用beforeHandshake()。为什么beforeHandshake()甚至没有被调用,因为我从Android向服务器发送了一个握手请求?
=============----期刊题录与文摘内容
让我把事情弄简单点。
我做了以下测试
1.运行Sping Boot 服务器
1.启动Android应用程序。
1.已成功建立WebSocket连接。
1.重新启动Spring Boot服务器

  1. WebSocket联机已关闭
  2. Android发送HTTP握手以重新连接WebSocket,我得到了Expected HTTP 101 response but was '400 '
    我不确定为什么重新启动会使服务器的行为发生变化。
h6my8fg2

h6my8fg21#

将WebSocket URL更改为ws://10.0.2.2:8080/<your_end_point_here>/websocket对我来说很有效。必须在终点后添加/websocket

相关问题