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

我试图将一个古老的网络摄像机连接到我的计算机,我陷入了一个非常根本的问题 – 检测流的结束。

我正在使用TcpClient与摄像头通信,我实际上可以看到它传输命令数据,这里没有问题。

  List incoming = new List(); 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作为其余元素的值而它不是停止,直到我手动停止执行。 这是它的样子: 数据

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

非常感谢,

H。

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

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

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