WPF项目里使用ClientWebSocket和服务端进行通信,一共有2个地方用到了,但是在使用HttpWebRequest调服务器接口会出现超时现象,在固定调用第三次的时候就会出现超时,之后一直都是超时,但是只要我注释掉其中一个使用ClientWebSocket的代码,就不会出现这个问题,我不明白ClientWebSocket还会影响到HttpWebRequest的使用吗,而且每次我都已经将其资源释放了,不明白为什么,有点崩溃,有没有厉害的,大概使用的结构就是下面形式:
对了,使用HttpWebRequest对象的时候我也都把资源释放了
还有,服务端使用了Ngnix来处理请求
ClientWebSocket _webSocket = null;
// CancellationToken _cancellation = null;
public async void ClientSocket()
{
try
{
_webSocket = new ClientWebSocket();
CancellationToken _cancellation = new CancellationToken();
//建立连接
var url = "服务器url";
await _webSocket.ConnectAsync(new Uri(url), _cancellation);
var bsend = new byte[1024];
await _webSocket.SendAsync(new ArraySegment<byte>(bsend), WebSocketMessageType.Binary, true, _cancellation); //发送数据
while (true)
{
var result = new byte[1024];
await _webSocket.ReceiveAsync(new ArraySegment<byte>(result), new CancellationToken());
//这里就是一些服务器返回信息之后的本地处理
await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None);
_webSocket.Dispose();
_webSocket.Abort();
_webSocket = null;
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
为了以防万一,在别的地方我也主动做了一个关闭的处理:
public async void CloseSocket()
{
if (_webSocket != null && _webSocket.State == WebSocketState.Open)
{
await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None);
_webSocket.Dispose();
_webSocket.Abort();
}
}
说实话,我完全没看懂这代码在干嘛。你从那个博文里抄的啊
await _webSocket.ConnectAsync(new Uri(url), _cancellation);
var bsend = new byte[1024];
await _webSocket.SendAsync(new ArraySegment<byte>(bsend), WebSocketMessageType.Binary, true, _cancellation); //发送数据
嗯,给服务器发一串1024字节的空数据干嘛??你服务器要求的么?
while (true)
{
var result = new byte[1024];
await _webSocket.ReceiveAsync(new ArraySegment<byte>(result), new CancellationToken());
await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None);
_webSocket.Dispose();
_webSocket.Abort();
_webSocket = null;
}
嗯,从服务器接收数据我能理解,但是后面一串关闭释放又是干啥的?
websocket是长连接的,发一条收一条就关闭用哪门子的websocket啊。
我觉着你先别急着改代码,自己先用netcore随便写个mock本地服务(花不了5分钟,1分钟建立一个net5/netcore项目,然后用use.websocket d带调试2分钟,编写一个ws的接收和发送代码2分钟)
然后你连接你自己本地的服务器试试看连接本地的服务ok不ok,如果不ok在改你程序。如果ok,请联系你们的运维,让他检查nginx设置去
超时设置长一些
检查网络环境、端口、防火墙、服务器程序