日期:2014-05-20  浏览次数:20881 次

关于NetworkStream的传输的几个问题
我有个项目,其中使用到NetworkStream在网络上进行文件传输。由于本人第一次做这种大文件1M以上的网络传输,在实践中发现发送端将一个4M的文件分块(64K)发送时,接收端如果以8K以下的块接收是正常的,而以大于8K的块来接收就会造成接收到的文件的最后会有部分数据缺失的情况。而且接收的缓存块越大于8K 则最后的数据缺失得越严重。(注明,当我发小文件的时候即使是分了更小的块发送也是正常的,不会有问题)

  不是太了解NetworkStream的传输机制,但我好像知道有一个NetworkStream的接收或发送缓存, 这个是不是会影响到接收代码的逻辑?比如当接收端接收不过来的时候 会造成NetworkStream缓存被发送端填满,而如果没有握手机制,发送端不管这个 会继续发送,而接收端的缓存满了以后 ,就会把这些新发过来的数据直接丢掉呢?

  如果是这样,那是不是即使是使用TCP协议传输文件,分块的时候也必须在接收端的代码中手动发回对每个块的确认信息给发送端,然后发送端再发下一个块的数据呢?但感觉这样操作岂不是和UDP传输一样了?


  有经验做过这方面东西的朋友能不能给一个比较健壮的发送接收的具体详细点的过程逻辑给我。。
------解决方案--------------------
注意 DataAvailable 

http://social.msdn.microsoft.com/Forums/en-US/759f3f2f-347b-4bd8-aa05-fb7f681c3426/networkstreamread-does-not-always-read-the-full-string-returned-from-the-server
------解决方案--------------------
if (!iar.IsCompleted)
应该是
while (!iar.IsCompleted)
循环等待吧
  
*****************************************************************************
签名档: http://feiyun0112.cnblogs.com/