本帖最后由 cweisledxianzai 于 2014-09-04 14:19:13 编辑

解决方案 »

  1.   

    不知道,也不想知道...
    你还是先参考网上现成的代码,看看人家都是怎么做客户端和服务端的,不能老凭自己想象瞎写啊
    你点了按钮之后,进入ACCEPT?这都什么思路.
    而且数据缓冲区,定义成50000000大小,只发送一次,接收一次??
    只能说,这个代码用来做实验还行,根本用不了.
      

  2.   

    你不能这样发送文件。你一次性读出文件,然后又一次性地发送,如果文件内容很小的话,用这种方法文件是可以发送成功的;如果文件内容比较大,这样发送肯定不会成功,因为socket发送数据是有大小限制的。最好的做法就是先定义数据包格式,然后把文件拆分成N个数据包,每次发送一个数据包,每次发送完可以设置一个时间间隔,直到数据包全部发送完成。这还只是简单的数据包发送方法,严格来说用socket发送数据还需要对数据进行校验、并判断数据是否发送成功,如果成功才继续发送下一个数据包。
      

  3.   

    严格来说用socket发送数据还需要对数据进行校验
    ->
    TCP底层已经做好了数据校验和重发机制,不需要自己再做校验
    不过还是需要检测一下数据包长度
      

  4.   

    网上的很多代码执行后也是这样加上线程暂停或者新建线程就能传送。单一线程就不行。 好像这个链接的就是http://bbs.csdn.net/topics/340085446
      

  5.   

    你的这个问题出在服务端接收上,把代码改成下面的试试看            int len = 0;
                if (nSocket.Connected)
                {
                    len = nSocket.Receive(buffs2, 0, buffs2.Length, SocketFlags.None);            }
                using (FileStream writer = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None))
                {
                    writer.Write(buffs2, 0, len);
                    writer.Flush();
                }
      

  6.   

    。嗯。修改为正常大小确实可以发送。下面是我的疑问。你在瞅瞅。接收端:接收文件的缓冲区还有FileStream这两个设置的值。都大于发送过来文件的总大小。例如发送端总字节数为40万。接收端设置的值为50万字节。
    如果发送端给Connect和send之家加上一个线程暂停(1毫秒就行)。或者Connect后创建一个新线程了来执行发送都可以正常传送文件。但是不加线程暂停,不创建新线程在一个线程上。那么文件就不能发送成功。
    理论上不应该出现这个问题才对。