У меня довольно простая архитектура клиент / сервер с использованием TCP-клиента. Сервер настроен на закрытие соединений от клиентов, от которых он не получил сообщение в течение двух минут. Я убедился, что это нормально работает, используя TCP-клиент C ++ для моего устройства Android. Однако мой клиент C # всегда кажется подключенным, даже после того, как сервер закрывает соединение.
Я пробовал множество вещей, и ни один из них, похоже, не сообщает точно, что соединение было закрыто. TcpClient.Connected всегда возвращает истину, даже после отправки и получения сообщений, в отличие от того, что указано в документации MSDN. Код клиента C #:
var client = new TcpClient(server, port);
var stream = client.GetStream();
//Wait >2 mins to get disconnected
await Task.Delay(Timespan.FromMinutes(2.5));
void Write()
{
try
{
var data = BuildByteArrayFromMyData();
stream.Write(data , 0, data.Length);
if(!client.Connected)
{
//Never triggered, Connected always equals true
}
}
catch(Exception ex)
{
//Never triggered
}
}
void ReadOnAnotherThread()
{
while (true)
{
try
{
while (!stream.DataAvailable)
{
if (!client.Connected) break; //Never triggered, Connected always equals true
else await Task.Delay(TimeSpan.FromMilliseconds(11));
}
byte[] data = new byte[];
int bytes = stream.Read(data, 0, data.Length);
}
}
catch(Exception ex)
{
//Never triggered
}
}
В: Как правильно использовать TcpClient.Connected?
Подобные вопросы, которые НЕ отвечают на предложенный здесь вопрос:
TcpClient.Connected
. Это очень вводящее в заблуждение имя свойства, которое на самом деле должно называтьсяTcpClient.UsedToBeConnectedAtSomePointInThePastAndAsFarAsIKnowItStillIsButImNotSure
. Другими словами, это практически бесполезно. Для обнаружения разорванных соединений лучше всего отправлять данные через регулярные промежутки времени, так как I опишите в моем блоге. - person Stephen Cleary   schedule 23.10.2014