客户端为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字节的。

解决方案 »

  1.   

    我用的是.NET自带的PocketPC模拟器,会不会是模拟器的BUG?
      

  2.   

    遇到同样的问题,从服务器接收的实际长度应该为19517,但是netstream.read方法每次读到17463的时候后面的数据就不读了,怎么回事?
    需要thread.sleep吗?好像试了也不行。郁闷中
      

  3.   

    终于解决了,与大家共享之!
    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的资料,都没有提及这个和解决这个问题的,无奈在自己的摸索之下,
    花了不少时间终于琢磨出来了,开心,与大家共享这段代码。以便以后有此类问题的可以得到帮助。