C# TCP读卡器丢失一些数据

C# TCP读卡器丢失一些数据,c#,tcp,C#,Tcp,我编写了以下从tcp服务器读取数据的简单代码: TcpClient myTcpClient = null; NetworkStream myNetworkStream = null; myTcpClient = new TcpClient(pRemoteIP, pPort); myNetworkStream = myTcpClient.GetStream(); myNetworkStrea

我编写了以下从tcp服务器读取数据的简单代码:

         TcpClient myTcpClient = null;
        NetworkStream myNetworkStream = null;

            myTcpClient = new TcpClient(pRemoteIP, pPort);
            myNetworkStream = myTcpClient.GetStream();
            myNetworkStream.ReadTimeout=4000;                              


            Byte[] bMesssage = Encoding.UTF8.GetBytes(pMessage);              


            myNetworkStream.Write(bMesssage, 0, bMesssage.Length);            

            Byte[] answer = new Byte[1024];
            string sAnswer = "";
            int offset = 0;              
            while (true)                                                      
            {                
                myNetworkStream.Read(answer, offset, 1024);                   
                sAnswer = Encoding.UTF8.GetString(answer);
                if (sAnswer.Contains("#END#")) break;                         

                Array.Resize(ref answer, answer.Length + 1024);               
                offset += 1024;
            }
            int i = sAnswer.IndexOf("#END#");
            sAnswer = sAnswer.Substring(0, i);

            myNetworkStream.Close();
            myNetworkStream.Dispose() ;
            myTcpClient.Close();
有时它可以正常工作,读取服务器发送的大块数据,但有时它会“丢失”一些数据并获得5000个字符,而不是25000个字符


有什么问题吗?

您没有使用myNetworkStream.Read的返回值来确定实际读取了多少数据。它一次可以低到一个字节


或许,您应该使用
StreamReader
来更方便地读取字符串。基于协议行。

您没有使用myNetworkStream.Read的返回值来确定实际读取的数据量。它一次可以低到一个字节

或许,您应该使用
StreamReader
来更方便地读取字符串。使您的协议行为基础。

通常,您会将“缓冲区”保持在相同的大小,并累积响应,直到获得“消息结束”标记:

通常,您会将“缓冲区”保持在相同的大小,并累积响应,直到获得“消息结束”标记:


我同意@usr的建议。但是,不使用读取返回的计数并不能解释丢失。相反,RRM可能会得到比预期大小更大的数组。可能某些API无法处理这可能导致的零字符。我不知道为什么会这样。也许OP只是被误诊了,或者代码丢失了。这不是第一次了。;例如,他的字符串将有多达1023个字符的间隙。也许他没有看到数据是因为所有的视觉空白。我同意@usr的建议。但是,不使用读取返回的计数并不能解释丢失。相反,RRM可能会得到比预期大小更大的数组。可能某些API无法处理这可能导致的零字符。我不知道为什么会这样。也许OP只是被误诊了,或者代码丢失了。这不是第一次了。;例如,他的字符串将有多达1023个字符的间隙。可能是因为所有的视觉间隙,他看不到数据。UTF8不能在任意边界上拆分。这将非决定性地失败。@usr,我已经习惯了用ASCII做这件事,我甚至没有注意到UTF8部分。以前没有使用过UTF8,如果你像我上面的编辑那样将它累积到内存流中,它会工作得更好吗?我认为这会工作,尽管代价是二次的。事实上,我很高兴看到一个不使用ASCII的问题。Die、ASCII、Die.UTF8不能在任意边界拆分。这将非决定性地失败。@usr,我已经习惯了用ASCII做这件事,我甚至没有注意到UTF8部分。以前没有使用过UTF8,如果你像我上面的编辑那样将它累积到内存流中,它会工作得更好吗?我认为这会工作,尽管代价是二次的。事实上,我很高兴看到一个不使用ASCII的问题。死吧,死吧。
        Byte[] answer = new Byte[1024];
        string sAnswer = "";
        int bytesRead;
        MemoryStream ms = new MemoryStream();
        while (true)
        {
            bytesRead = myNetworkStream.Read(answer, 0, answer.Length);
            ms.Write(answer, 0, bytesRead);
            sAnswer = Encoding.UTF8.GetString(ms.ToArray());
            if (sAnswer.Contains("#END#")) break;
        }
        int i = sAnswer.IndexOf("#END#");
        sAnswer = sAnswer.Substring(0, i);