TCP读取器丢失一些数据

时间:2015-07-10 16:19:52

标签: c# tcp

我编写了这个简单的代码来从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个字符。

它有什么问题吗?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

        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);