gpt4 book ai didi

c# - 如何在 C# 中创建可以从丢失的网络连接中恢复的 TcpClient?

转载 作者:太空宇宙 更新时间:2023-11-03 16:12:56 24 4
gpt4 key购买 nike

我正在尝试编写一个 TCP 客户端线程,它将连接到服务器并在接收到数据时继续处理数据。有时客户端会失去与服务器的连接。当重新建立连接时,线程应该恢复/恢复并自动重新开始处理数据。我似乎无法让它工作。基本算法如下。我的问题是我不太了解网络连接丢失时 TcpClient 的行为。我怎么知道连接已经丢失?然后我需要关闭连接吗?如何重新建立连接并继续?

TcpClient _tcpClient;
IPEndPoint _ipEndPoint;
bool _cancelled = false;
bool _error = true;
while (!_cancelled)
{
try
{
if(_error)
{
_ipEndPoint = new IPEndPoint(_myAddress, _myPort);
_tcpClient.Connect(_ipEndPoint);
_networkStream = _tcpClient.GetStream();
_error = false;
}
else
{
_data = new byte[10025];
if(_networkStream.CanRead)
{
_bytesRead = _networkStream.Read(_data, 0, (int)_tcpClient.ReceiveBufferSize);
if(_bytesRead > 0)
{
...process the data...
}
else
{
_error = true;
}
}
else
{
_error = true;
}
}
}
catch(Exception ex)
{
...log error...
_error = true;
}
}

最佳答案

TcpClient 上有一个 Connected 属性,但它仅在 NetworkStream 上执行 Write 或 Read 时更新。

如果您想强制进行连接检查,我认为您可以只执行 Read(null,0,0) 或 Write(null,0,0)。但是在示例中,您可以在 _networkStream.Read 完成后检查 Connected 或 CanRead 属性。

至于重新建立链接,您所拥有的将起作用。我建议在获得新网络流之前先处理旧网络流。像这样:

if(_networkStream != null)
{
_networkStream.Dispose();
}
_networkStream = _tcpClient.GetStream();

我所做的是启动一个重新连接计时器,它将尝试在配置的时间间隔内重新连接。根据您连接到的 TcpHost,您甚至可能希望以 500-1000 毫秒的小间隔开始尝试,并且增量是在给定次数的失败重试之后,这样您就不会浪费大量时间尝试连接到已经消失的主机。然后在达到最大尝试次数后放弃,除非用户明确要求重试。但这也取决于您的应用程序还在做什么,连接是它的唯一目的还是它只是一个部分。

我用来与 TcpClient 交互的包装类大约有 700 行代码,它处理重新连接、发送数据以及读取数据。我在一家封闭的商店工作,所以我不能发布它,但如果你有任何其他具体问题,我很乐意提供帮助。

祝你好运。

关于c# - 如何在 C# 中创建可以从丢失的网络连接中恢复的 TcpClient?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16826794/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com