我正在开发一个带有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服务器
- WebSocket联机已关闭
- Android发送HTTP握手以重新连接WebSocket,我得到了
Expected HTTP 101 response but was '400 '
我不确定为什么重新启动会使服务器的行为发生变化。
1条答案
按热度按时间h6my8fg21#
将WebSocket URL更改为
ws://10.0.2.2:8080/<your_end_point_here>/websocket
对我来说很有效。必须在终点后添加/websocket
。