我正在尝试编写一个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;
}
}
答案 0 :(得分:0)
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-1000ms的小间隔开始尝试,并且在给定次数的失败重试之后增加,这样你就不会浪费很多时间来尝试连接到已经消失的主机。然后在最大尝试次数之后放弃,除非用户明确要求再次尝试。但这也取决于你的应用程序正在做什么,如果连接是它的唯一目的,或者只是它的一个。
我用来与TcpClient交互的包装类大约有700行代码,它处理重新连接,发送数据以及读取数据。我在一个封闭的商店工作,所以我不能发布它,但如果你有任何其他具体的问题,我很乐意帮助。
祝你好运。