客户端为PDA,发送数据代码段如下:// 发送数据
string sXML = cmd.ToXMLString();
Byte[] data = System.Text.Encoding.Unicode.GetBytes(sXML);
NetworkStream stream = client.GetStream();
stream.Write(data, 0, data.Length);
stream.Flush();
服务器端为PC机,接收代码段如下:
cpClient client = server.AcceptTcpClient();
NetworkStream stream = client.GetStream();
Byte[] buffer = new Byte[1024];
String sXML = "";
int totalRead = 0;
int numberOfBytesRead = 0;
do
{
numberOfBytesRead = stream.Read(buffer, 0, buffer.Length);
sXML = String.Concat(sXML, Encoding.Unicode.GetString(buffer, 0, numberOfBytesRead));
totalRead += numberOfBytesRead;
}
while (stream.DataAvailable);
现在有个问题,客户端发送600字节的数据,服务器有时能完整的接收下来,有时却只接收到部份,如536字节。在数据小于200字节的情况下每次都能完整接收下来,数据量稍一大就会有问题。搞不清楚问题的原因在哪里,服务器端开了1024字节的缓冲区,比数据量要大的,怎么还会出现数据不完整的现象啊?还有一点很奇怪,同样的数据往往是中断在同一个地方,比如600字节,服务器出错时每次都只读出536字节,还挺有规律。但是客户端调试确实是发送了600字节的。
string sXML = cmd.ToXMLString();
Byte[] data = System.Text.Encoding.Unicode.GetBytes(sXML);
NetworkStream stream = client.GetStream();
stream.Write(data, 0, data.Length);
stream.Flush();
服务器端为PC机,接收代码段如下:
cpClient client = server.AcceptTcpClient();
NetworkStream stream = client.GetStream();
Byte[] buffer = new Byte[1024];
String sXML = "";
int totalRead = 0;
int numberOfBytesRead = 0;
do
{
numberOfBytesRead = stream.Read(buffer, 0, buffer.Length);
sXML = String.Concat(sXML, Encoding.Unicode.GetString(buffer, 0, numberOfBytesRead));
totalRead += numberOfBytesRead;
}
while (stream.DataAvailable);
现在有个问题,客户端发送600字节的数据,服务器有时能完整的接收下来,有时却只接收到部份,如536字节。在数据小于200字节的情况下每次都能完整接收下来,数据量稍一大就会有问题。搞不清楚问题的原因在哪里,服务器端开了1024字节的缓冲区,比数据量要大的,怎么还会出现数据不完整的现象啊?还有一点很奇怪,同样的数据往往是中断在同一个地方,比如600字节,服务器出错时每次都只读出536字节,还挺有规律。但是客户端调试确实是发送了600字节的。
需要thread.sleep吗?好像试了也不行。郁闷中
byte[] byteData=new byte[pktlen];//包的长度/可以从包头中得到
int iLoc=inStream.Read(byteData,0,byteData.Length);
bool blgo=inStream.DataAvailable;//如果为true则还有可以读取的数据,如果读完的话,则为false
if(blgo==true)
{
int startLoc=iLoc;
byte[] goval=new byte[byteData.Length -iLoc];//未读完的数量可以算出,建立数组
iLoc=inStream.Read(goval,0,goval.Length);//继续读取未读完的数据
goval.CopyTo(byteData,startLoc);//拷贝到byteData的相应位置替换其中的0(0即空)
}
查了网上所有socket,networkstream的资料,都没有提及这个和解决这个问题的,无奈在自己的摸索之下,
花了不少时间终于琢磨出来了,开心,与大家共享这段代码。以便以后有此类问题的可以得到帮助。