C# - TcpClient - 检测流结束?

标签 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() 进行了另一个版本。描述指出:

Reads a byte from the stream and advances the position within the stream by one byte, or returns -1 if at the end of the stream.

所以我认为我可以按照以下方式实现一些东西:

        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.

最佳答案

您缺少的是您对 TCP 数据流的看法。这是一个开放的连接,就像一条开放的电话线 - 另一端的人可能正在通话,也可能没有通话 (DataAvailable),只是因为他们停下来喘口气 (DataAvailable== false) 这并不意味着他们实际上已经完成了当前的声明。片刻之后他们可以再次开始交谈 (DataAvailable==true)

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

关于C# - TcpClient - 检测流结束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6522869/

相关文章:

c# - MVC - 绑定(bind) ICollection 属性

C 从客户端向服务器提交命令

c# - 通过 TCP 发送和接收 XML 数据

c# - C#-登录到防火墙的套接字

python - 异步服务器和客户端处理来自控制台的输入

c# - 作为系统执行任务?

c# - 使用 IronPython 简化为 C# 应用程序编写的 DSL

c# - 更改静态 int 变量时触发事件?

c - 绑定(bind)套接字时为什么要将端口号转换为网络字节序?

python-3.x - 以下Python套接字级编程代码在什么时候卡住了?