//自定义心跳连接
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();
}
});