在C#中,要為TcpClient實現心跳檢測,你需要在客戶端和服務器端都進行一些操作
首先,我們創建一個心跳消息類,用于在客戶端和服務器之間傳遞心跳信息。
public class HeartbeatMessage
{
public string Type { get; set; } = "Heartbeat";
}
接下來,我們在服務器端添加一個方法來處理心跳消息。
private void ProcessHeartbeat(NetworkStream stream)
{
// 發送心跳響應
var heartbeatResponse = new HeartbeatMessage();
var serializedResponse = JsonSerializer.Serialize(heartbeatResponse);
var responseBytes = Encoding.UTF8.GetBytes(serializedResponse);
stream.Write(responseBytes, 0, responseBytes.Length);
}
然后,在服務器端的主循環中檢查接收到的消息是否為心跳消息。
while (true)
{
var message = ReadMessage(clientStream);
if (message.Type == "Heartbeat")
{
ProcessHeartbeat(clientStream);
}
else
{
// 處理其他類型的消息
}
}
在客戶端,我們需要定期發送心跳消息,并接收服務器的心跳響應。
private async Task SendHeartbeatAsync(TcpClient client)
{
while (client.Connected)
{
var heartbeatMessage = new HeartbeatMessage();
var serializedMessage = JsonSerializer.Serialize(heartbeatMessage);
var messageBytes = Encoding.UTF8.GetBytes(serializedMessage);
var stream = client.GetStream();
await stream.WriteAsync(messageBytes, 0, messageBytes.Length);
await Task.Delay(5000); // 每5秒發送一次心跳
}
}
在客戶端的主循環中,我們需要接收服務器的心跳響應。
while (true)
{
var message = ReadMessage(clientStream);
if (message.Type == "Heartbeat")
{
// 收到心跳響應,更新最后接收到心跳的時間
lastHeartbeatTime = DateTime.UtcNow;
}
else
{
// 處理其他類型的消息
}
// 檢查是否超過了心跳超時時間
if (DateTime.UtcNow - lastHeartbeatTime > TimeSpan.FromSeconds(10))
{
// 斷開連接或重新連接
break;
}
}
最后,在客戶端的主函數中,啟動心跳發送任務。
var heartbeatTask = SendHeartbeatAsync(client);
這樣,你就實現了一個基本的TCP客戶端和服務器之間的心跳檢測機制。當然,你還可以根據自己的需求對這個實現進行優化和擴展。