本帖最后由 iloli 于 2014-01-26 16:08:26 编辑

解决方案 »

  1.   

    你的意思是你预设定的bufferSize无法接受大文件
    我给你的建议是 如果是10M的文件 你可以分十次来传 一次传1M  (我只是比方说)
    然后在发送文件之前 向对方发送 文件传输命令 在传递完成后 向对方发送传递完成命令
    你没有对Socket封装 你直接使用它的Send和Receiver 这样做项目的话 如果遇到传文件的需求 然后就可以 呵呵了
      

  2.   

    用 BinaryReader 是多此一举,问题可能就出在它身上。
      

  3.   

    试了不用BinaryReader  直接使用FileStream的方法 还是一样的。接收的文件的最后总有一些数据缺失 
      

  4.   

    bufferSize 是个数组嘛 大小可以随便设的。我的意思是当我要传小文件如1K左右 bufferSize 无论怎么设 传文件都是成功的不会有缺失数据的情况。但当试着传一个大文件如4M以上的文件时,接收端收到的文件的最后一部分总会有缺失。但有时候我调试的时候有时会正常。我猜想是不是速度太快了接收端处理不过来而遗漏了?但是TCP的传输不应该有这个问题啊。。
      

  5.   

    大哥,我代码传小文件的时候如1K 左右 一点问题都没有。只能说有BUG,但这不是不知道问题出现在哪嘛。所以上来求教。
      

  6.   

    好像解决了,但不确定问题出在呢。。现在我把接收端的接收方法也做了个后台线程,这个时候就没问题了。。之前发送端是启动了一个后台线程来发送文件。而接收端直接在UI线程中接收文件的,所以大文件一点接收UI界面都会卡一下。不知道是不是就是因为这卡一下 而造成了接收大文件的最后有部分数据缺失的情况呢?
      

  7.   

    还发现一个问题。
    虽然发送接收都用了后台线程来做,但是接收端的缓存数组大小必须要比发送端的小很多才不会接收时缺少数据。
    如发送端我设为64K 而接收端要设为8K 才正常。接收到的数据缺失的情况是接收端的缓存比8K越大 缺失得越严重这让我想到一个问题。是不是使用TCP的方法发送 也要对分片的每一次发送的数据进行接收端手动确认才行?那UDP 没什么好大区别了
      

  8.   

    试了不用BinaryReader  直接使用FileStream的方法 还是一样的。接收的文件的最后总有一些数据缺失 
    看样子是楼主的接收代码过度包装了,其实的很简单的一块,只需两句。
    while ((receiveLength = ns.Read(recBufs, 0, recBufs.Length)) > 0)
    {
        wr.Write(recBufs, 0, receiveLength);
    }
      

  9.   

    bufferSize 是个数组嘛 大小可以随便设的。我的意思是当我要传小文件如1K左右 bufferSize 无论怎么设 传文件都是成功的不会有缺失数据的情况。但当试着传一个大文件如4M以上的文件时,接收端收到的文件的最后一部分总会有缺失。但有时候我调试的时候有时会正常。我猜想是不是速度太快了接收端处理不过来而遗漏了?但是TCP的传输不应该有这个问题啊。。就是这样啊
      

  10.   

    bufferSize 是个数组嘛 大小可以随便设的。我的意思是当我要传小文件如1K左右 bufferSize 无论怎么设 传文件都是成功的不会有缺失数据的情况。但当试着传一个大文件如4M以上的文件时,接收端收到的文件的最后一部分总会有缺失。但有时候我调试的时候有时会正常。我猜想是不是速度太快了接收端处理不过来而遗漏了?但是TCP的传输不应该有这个问题啊。。就是这样啊就是这样是什么意思。
    接收端接收不过来?那怎么处理比较 好
      

  11.   

    bufferSize设置1M的大小
    如果文件有10M 那就传10次 不是文件缺失  而是 大文件你的bufferSize不够大 接受不了那么大的文件
      

  12.   

    。晕 bufferSize 又不是一次读取10M 它只是一个缓存。如果10M 文件,bufferSize只有1M 那它就会按位置从文件0开始读10次,每从文件读一次内容到缓存bufferSize中 再发送数据。
      

  13.   

    。晕 bufferSize 又不是一次读取10M 它只是一个缓存。如果10M 文件,bufferSize只有1M 那它就会按位置从文件0开始读10次,每从文件读一次内容到缓存bufferSize中 再发送数据。我的发送和接收代码都是用了WHILE 循环的,直接读到文件尾部 。
      

  14.   


    明明是同步的逻辑,非要用异步的API实现, 何必呢?直接用同步的API不就好了,
    socket.send(), socket.receive(),
    简简单单就好了
      

  15.   

    如果你折腾什么while循环,还学人家些什么异步代码?把你那“拿着异步代码,模仿人家同步程序”的东西删除掉,也就是把什么 beginXXXX 的改为不带 begin 的语句,就行了。不打算进行正常的异步编程,就别瞎写。你的这个代码多余地弄一堆烂七八糟的步骤出来,只是为了弄“假异步”,结果让人懒得看了。
      

  16.   

    我就告诉你一个原则,很简单,异步编程就根本不可能去搞什么while循环、if判断然后等待。