其实你这并不是问题,只是你疑惑而已,当你清楚Socket的工作原理后,你就不会疑惑了。
Socket里的inputStream和outputStream是负责Socket的输入和输出,并且他们都是阻塞的,除非关闭Socket或者shutdown对应的Stream。
为什么你sleep几秒后数据就全了呢?因为数据在Socket上是边传边收,而不是传完了再收,这是你理解的一个误区,所以我建议你们在传输数据的时候,能在头几位(这里是指byte)指明后面要接受的数据的长度,用read(buf,offset,len)方法肯定可以完整得到你想要的数据,不需要sleep(如果数据够大的话,sleep也是解决不了问题的)。或者你可以用一组约定字符表示结束,一直读到约定字符为止。

解决方案 »

  1.   

    数据发送是有时间的,而且一般是分批发送,所以一次性收不全很正常,循环收直到完整收下来就行了。TCP会保证数据包的顺序和完整性,完整性指的是发送过去的每个数据包是完整的,但是这里所说的数据包是协议层的数据包,不是应用层的。应用层一个数据包,协议层可能切分成N个。
      

  2.   

    TCP包的大小是有限制的,网络端口的缓存也有大小。
    所以,如果你用普通SOCKET读数据,如果所续数据未收到,肯定会阻塞。
      

  3.   

    因为发过来的是xml,没有这个xml的长度,所以现在是通过</endTag>来判断是否收全数据。顺便问下,如果服务器端连续发送aaa和bbb两段报文。那接收方会不会收到bababa?如果用长度来控制读取的长度,是不是要发送2次第一次length=4第二次1234
      

  4.   

    顺便问下,如果服务器端连续发送aaa和bbb两段报文。那接收方会不会收到bababa?
    ——绝对不会,但是可能会收到 3 组报文: aa ab bb如果用长度来控制读取的长度,是不是要发送2次
    ——这是比较靠谱的做法
      

  5.   

    Qt  做一个上位机程序,需要接受多台(1~100,这个环节用多线程解决了。)下位机采集来的数据(最多的时候是一台机器500MB,不是一次发来的,多的时候估计一次发300MB),现在就找不到方法。求指点。