我编写了这个简单的代码来从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个字符。
它有什么问题吗?
答案 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);