C# - TcpClient - 检测流的结束?

时间:2011-06-29 15:05:02

标签: c# sockets tcpclient networkstream

我正在尝试将古老的网络摄像头连接到我的计算机上,我遇到了一个非常根本的问题 - 检测到流的结束。

我正在使用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

所以我的问题是,我错过了一些基本的东西吗?如何检测流的结束?

非常感谢,

小时。

2 个答案:

答案 0 :(得分:16)

您缺少的是如何考虑TCP数据流。这是一个开放的连接,就像一个开放的电话线 - 另一端的人可能会或可能不会说话(DataAvailable),只是因为他们停下来呼吸(DataAvailable==false)它没有'这意味着他们实际完成了当前的陈述。片刻之后,他们可以再次开始谈话(DataAvailable==true

您需要为通信协议ABOVE TCP提供某种已定义的规则,这实际上只是一个传输层。因此,例如,当当前图像传输完成时,相机可能会向您发送特殊字符序列,因此您需要检查发送的每个字符,并确定该序列是否已发送给您,然后采取适当的行动。

答案 1 :(得分:2)

嗯,你不能在网络通信上确切地说EOS(除非另一方放弃连接),通常协议本身包含一些信号表明消息已完成(例如,有时是一个新行)。因此,您阅读流并提供缓冲区,然后通过应用这些策略提取完整的消息。