当我在 React Native 中打开 WebSocket 时,它会立即关闭。没有代码或原因。它还收到一个没有消息的错误。我通过 ngrok http 隧道使用 WebSocket。我的服务器收到请求并完成连接。如果我立即发送数据,就会收到,但大约 1/4 秒后,连接关闭,我无法发送任何数据。然后,我在服务器端收到一条错误消息,指出连接在未完成握手的情况下已关闭。我做错了什么?这是在 Android 上。
C# 服务器代码:
app.Use(async (context, next) => {
if (!context.Request.Path.ToString().Contains("/notifications/"))
{
await next();
return;
}
if (context.WebSockets.IsWebSocketRequest) {
WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();
} else {
context.Response.StatusCode = (int)HttpStatusCode.BadRequest;
}
});
JS客户端代码:
import Defaults from "../Defaults";
import Services from "../Services";
export default class NotificationService {
constructor(){
this.socket = null;
}
subscribe(userId, onmessage){
let url = Defaults.webRoot.replace('http', 'ws') + '/notifications/' + userId;
this.socket = new WebSocket(url);
this.socket.onmessage = onmessage;
this.socket.onerror = this.onerror;
this.socket.onclose = this.onclose;
this.socket.onopen = this.onopen;
}
onerror(event){
alert('ws error: ' + event.message);
}
onclose(event){
alert('ws closed: ' + event.code + ' - ' + event.reason);
}
onopen(event){
alert('ws opened');
}
}
onclose 显示
'ws closed: undefined - undefined'
。
我在稍后的请求中使用套接字,但我必须假设请求完成后套接字不会立即关闭,那是愚蠢的。
当它到达我发送消息的代码时,状态是
Open
。但明显是关闭的,客户端收不到消息。
我想通了。如果我完成请求,由于某种原因,这也会关闭网络套接字。尽管我假设请求和套接字本身是两个完全不同的东西,但响应中一定有一些东西让网络套接字感到困惑。
我基本上必须添加这一行来保持套接字处于活动状态:
while (!webSocket.State.HasFlag(WebSocketState.Closed) && !webSocket.State.HasFlag(WebSocketState.Aborted)) {}
我真的不确定这会对性能产生什么影响,而且我担心我必须这样做。我想你可以通过在 while 循环中调用
Thread.Sleep
来让它稍微不那么可怕。
希望有人能更好地理解这个问题,并知道如何更好地解决这个问题。