WebSocket客户端向服务发送心跳和接收信息

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

 

posted @ 2023-06-29 11:19  NangFah  阅读(71)  评论(0)    收藏  举报