C# 如何确定TCP客户端连接何时中断并重新连接
编辑:我理解这个问题,但需要一个代码示例来说明如何解决它 我希望我的客户端在断开连接时自动重新连接,但它显示为C# 如何确定TCP客户端连接何时中断并重新连接,c#,sockets,C#,Sockets,编辑:我理解这个问题,但需要一个代码示例来说明如何解决它 我希望我的客户端在断开连接时自动重新连接,但它显示为TcpClient。已连接的对它来说不可靠。我已经读到,您需要为类发送数据以更改该标志。有没有更好的方法来处理这个问题 //Method to handle reading data from buffer and deserializing public static async Task<Message> ReadMessageAsync(this TcpClient c
TcpClient。已连接的
对它来说不可靠。我已经读到,您需要为类发送数据以更改该标志。有没有更好的方法来处理这个问题
//Method to handle reading data from buffer and deserializing
public static async Task<Message> ReadMessageAsync(this TcpClient client)
{
if (client.Connected && client.Available > 0)
{
int totalBytesRead = 0;
var data = new byte[client.Available];
while (totalBytesRead < client.Available)
{
totalBytesRead += await client.GetStream().ReadAsync(data, 0, client.Available);
}
return BinarySerializer.DeserializeMessage(data) as Message;
}
return null;
}
public async Task Start()
{
ConnectToServer();
while (_isRunning)
{
// Reconnect to server if needed.
if (!_tcpClient.Connected)
{
ConnectToServer();
}
// Wait for data
var data = await _tcpClient.ReadMessageAsync();
HandleData(data);
}
}
//处理从缓冲区读取数据和反序列化的方法
公共静态异步任务ReadMessageAsync(此TcpClient客户端)
{
如果(client.Connected&&client.Available>0)
{
int totalBytesRead=0;
var data=新字节[client.Available];
while(totalBytesRead
TCP是一种非常健壮的协议,允许进行健壮的编程。对于客户机,您不需要依赖来自网络接口的低级别信令,协议/语言提供了您所需的一切(除非您的客户机时间紧迫,需要立即通知网络故障):
连接:
- 如果连接失败,请重试(在适当的超时后)或放弃
- 设置适当的接收超时,并在 引发超时异常(关闭套接字并重新启动) 再次或放弃,或通知用户或。将“信号”服务器死亡,或互联网死亡或
- 检查接收的字节==0(表示正常断开连接 从另一边,FIN)并相应地采取行动
- 如果另一方发送RST,您将得到一个异常,请处理该异常 因此
Connect
?旁注:这个类似乎希望您在程序流中使用异常,但这不是一个好的做法?请注意,您的代码会烧坏您的cpu,因为如果套接字中没有可用的数据(常见的事情),它基本上会变成while(true)循环。事件不会始终工作。事件由以太网接口上的活动引起。断开电缆将导致断开,但不会触发事件。正在关闭的服务器也不会导致该事件。事件发生的唯一时间是服务器关闭连接时。