C# - TcpClient-обнаружение конца потока?
Я пытаюсь подключить древнюю сетевую камеру к своему компьютеру, и я застрял в очень фундаментальной проблеме-обнаружении конца потока.
я использую TcpClient
для связи с камерой, и я действительно вижу, что он передает данные команды, здесь нет проблем.
List<int> incoming = new List<int>();
TcpClient clientSocket = new TcpClient();
clientSocket.Connect(txtHost.Text, Int32.Parse(txtPort.Text));
NetworkStream serverStream = clientSocket.GetStream();
serverStream.Flush();
byte[] command = System.Text.Encoding.ASCII.GetBytes("i640*480M");
serverStream.Write(command, 0, command.Length);
чтение ответа-это то,где начинается проблема. Сначала я думал, что что-то простое, как следующий бит кода, будет иметь работал:
while (serverStream.DataAvailable)
{
incoming.Add(serverStream.ReadByte());
}
но это не так, поэтому на этот раз у меня была другая версия, использующая ReadByte(). Описание гласит:
считывает байт из потока и продвигает позицию в рамках потоке на один байт, или возвращает -1, если в конце ручья.
поэтому я подумал, что могу реализовать что-то вроде:
Boolean run = true;
int rec;
while (run)
{
rec = serverStream.ReadByte();
if (rec == -1)
{
run = false;
//b = (byte)'X';
}
else
{
incoming.Add(rec);
}
}
нет, все еще не работает. Я могу видеть данные В и после определенного точка (которая не всегда одинакова, иначе я мог бы просто читать столько байтов каждый раз) я начинаю получать 0
как значение для остальных элементов, и он не останавливается, пока я вручную не остановлю выполнение. Вот как это выглядит:
Итак, мой вопрос в том, не упускаю ли я здесь чего-то фундаментального? Как я могу определить конец потока?
большое спасибо,
Х.
2 ответов
что вам не хватает, так это то, как вы думаете о потоке данных TCP. Это открытое соединение, как открытая телефонная линия - кто-то на другом конце может или не может говорить (DataAvailable
), и только потому, что они остановились, чтобы перевести дух (DataAvailable==false
) это не означает, что они действительно закончили с их текущим утверждением. Через мгновение они снова могли говорить (DataAvailable==true
)
вам нужно иметь какие-то определенные правила для протокола связи выше TCP, что на самом деле просто транспортный уровень. Так, например, возможно, камера отправит вам специальную последовательность символов, когда будет завершена передача текущего изображения, и поэтому вам нужно изучить каждый отправленный символ и определить, была ли эта последовательность отправлена вам, а затем действовать соответствующим образом.
Ну, вы не можете точно сказать, что EOS на сетевом сообщении ( если другая сторона не отключит соединение), обычно сам протокол содержит что-то, чтобы сигнализировать, что сообщение завершено (иногда новая строка, например ). Таким образом, Вы читаете поток и передаете буфер, и извлекаете полное сообщение, применяя эти стратегии.