//自定义心跳连接 public bool CheckAndReConnet(out string rcvMessage) { int iConnectTime = 0; rcvMessage = ""; ReConnectLable: if (webSocket == null) { if (iConnectTime >= 1) { rcvMessage = $"尝试重新连接服务,{iConnectTime}," + webAddr; Log.WriteLog(DateTime.Now.ToString() + "," + rcvMessage); Thread.Sleep(3000); } webSocket = new System.Net.WebSockets.ClientWebSocket(); if (!webAddr.ToLower().StartsWith(WEBSOCKET_URL_PREFIX)) { rcvMessage = "无效的地址,请检查(配置文件[SET]节点下[WebMachineAddr])"; Log.WriteLog(DateTime.Now.ToString() + "," + rcvMessage); return false; } iConnectTime++; } if (webSocket.State != WebSocketState.Open) { try { //防止硬件服务器断开了,然后导致文件 if (webSocket != null && webSocket.State != WebSocketState.None) { Log.WriteLog(DateTime.Now.ToString() + ",主动关闭"); webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, cancellationToken).GetAwaiter(); webSocket.Dispose(); webSocket = null; goto ReConnectLable; } var serverUri = new Uri(webAddr); webSocket.ConnectAsync(serverUri, cancellationToken).Wait(); } catch (Exception ex) { Log.WriteLog(DateTime.Now.ToString() + ",非正常情况,释放websocket"); webSocket.Dispose(); webSocket = null; goto ReConnectLable; } } //发送报文之前,先发一个 我是心跳包 几个字检测服务是否 主动 断开 if (webSocket.State == WebSocketState.Open) { try { WebUidRq rq = new WebUidRq { uid=Global.mac }; string heartPackage = JsonConvert.SerializeObject(rq); ArraySegment<byte> bytesToSend = new ArraySegment<byte>(Encoding.UTF8.GetBytes(heartPackage)); webSocket.SendAsync(bytesToSend, WebSocketMessageType.Text, true, cancellationToken).Wait(); //发送数据 //WebSocketReceiveResult result; //rcvMessage = ""; //do //{ // ArraySegment<byte> bytesReceived = new ArraySegment<byte>(new byte[1024]); // result = webSocket.ReceiveAsync(bytesReceived, cancellationToken).GetAwaiter().GetResult(); // rcvMessage += Encoding.UTF8.GetString(bytesReceived.Array, 0, bytesReceived.Count); //} //while (!result.EndOfMessage); // while (bytesReceived.Count < 1024); // Log.WriteLog(DateTime.Now.ToString() + ",MessageType: " + result.MessageType); //Log.WriteLog(DateTime.Now.ToString() + ",rcvMessage: " + rcvMessage); return true; } catch { webSocket.Dispose(); webSocket = null; goto ReConnectLable; } } else { Log.WriteLog(DateTime.Now.ToString() + ",非正常情况,主动关闭"); webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, cancellationToken).GetAwaiter(); webSocket.Dispose(); webSocket = null; goto ReConnectLable; } } /// <summary> /// 接收信息 /// </summary> private void Rcv() { try { if(webSocket != null && (webSocket.State == WebSocketState.Open) ) { WebSocketReceiveResult result; string rcvMessage = ""; do { ArraySegment<byte> bytesReceived = new ArraySegment<byte>(new byte[1024]); result = webSocket.ReceiveAsync(bytesReceived, cancellationToken).GetAwaiter().GetResult(); rcvMessage += Encoding.UTF8.GetString(bytesReceived.Array, 0, bytesReceived.Count); Log.WriteLog(DateTime.Now.ToString() + "," + "------------解析并接收数据------------"); Log.WriteLog(DateTime.Now.ToString() + ",message: " + rcvMessage); if (rcvMessage.Contains("shutdown")) { var psi = new ProcessStartInfo("shutdown", "/s /t 0"); psi.CreateNoWindow = true; psi.UseShellExecute = false; System.Diagnostics.Process.Start(psi); return; } else if (rcvMessage.Contains("reboot")) { var psi = new ProcessStartInfo("shutdown", "-r -f -t 0"); psi.CreateNoWindow = true; psi.UseShellExecute = false; System.Diagnostics.Process.Start(psi); return; } } while (!result.EndOfMessage); Log.WriteLog(DateTime.Now.ToString() + ",MessageType: " + result.MessageType); Log.WriteLog(DateTime.Now.ToString() + ",rcvMessage: " + rcvMessage); } } catch(Exception ex) { Log.WriteLog(ex.ToString()); } } 主函数: //引用 Task.Run(() => { while (true) { string outMessage = ""; //重新连接失败 if (CheckAndReConnet(out outMessage) == false) continue; Thread.Sleep(5000); } }); Task.Run(() => { while (true) { //重新连接失败 Rcv(); } });