C # - TcpClient - Обнаружение конца потока? - PullRequest
9 голосов
/ 29 июня 2011

Я пытаюсь подключить древнюю сетевую камеру к своему компьютеру, и я застрял в очень фундаментальной проблеме - обнаружении конца потока.

Я использую 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 в качестве значения для остальных элементов, и это не не останавливайтесь, пока я не остановлю выполнение вручную. Вот как это выглядит: data

Итак, мой вопрос: я что-то упустил здесь? Как я могу определить конец потока?

Большое спасибо,

H.

Ответы [ 2 ]

16 голосов
/ 29 июня 2011

Что вам не хватает, так это то, как вы думаете о потоке данных TCP.Это открытое соединение, как и открытая телефонная линия - кто-то на другом конце может говорить или не разговаривать (DataAvailable), и только потому, что он сделал паузу, чтобы перевести дух (DataAvailable==false), это не значит, что он 'на самом деле сделано с их нынешним заявлением.Мгновение спустя они могли бы снова начать говорить (DataAvailable==true)

Вам нужно иметь какие-то определенные правила для протокола связи НАД TCP, который на самом деле является просто транспортным уровнем.Так, например, возможно, камера отправит вам специальную последовательность символов, когда будет завершена передача текущего изображения, и поэтому вам нужно изучить каждый отправленный символ и определить, была ли эта последовательность отправлена ​​вам, а затем действовать соответствующим образом.

2 голосов
/ 29 июня 2011

Ну, вы не можете точно сказать EOS о сетевой связи (если только другая сторона не разорвёт соединение), обычно сам протокол содержит что-то, что сигнализирует о том, что сообщение завершено (например, новая строка). Итак, вы читаете поток и передаете в буфер и извлекаете полное сообщение, применяя эти стратегии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...