c#中 点对点的大文件传输 什么方法最可靠?
我采用的是 服务端连接后
byte[] data = new byte[1024];
int read=0;
Stream stream=File.OpenRead("路径");
do
{
  read=stream.Read(data,0,1024];
  netWorkStream.Write(data,0,read);
}
while(read >= 1024);
接收端
byte[] data=new byte[1024];
int read =0;
Stream stream=File.OpenWrite("路径");
do
{
  read=NetWorkStream.Read(data,0,1024);
  stream.Write(data,0,read);
}
while(read >= 1024);这样的方法理论上可行的,而且在传输小文件的时候也一切正常,但是在传输大文件的时候(上100m)的时候 接收端在没有接收完成的情况下就结束了循环,断点跟踪时发现接收端的read没有读取完流中的数据就<1024了,而发送端其实还在发送中,有办法是 read>0 但是这种发放发送端必须在发送完数据是关闭NetWorkStream才能使接收端的read<=0,但是我现在不想让发送端断开连接而是在发送完毕后继续等待下一条指令,所以敢问有什么方法是比较好的发送文件方式?

解决方案 »

  1.   

    1024都会读不到,网络被拥堵了?
    试一下多线程,sleep一点点时间
    我写的UDP传输都一点没问题(局域网,把文件分割成40k一个包)
      

  2.   

    还有,你写的while函数不太合理。
    可以这样:
    while(true)
    {
       sleep(100);
       read=NetWorkStream.Read(data,0,1024); 
       if(read<1024)
          continue;//这些数据想办法重发,或者按照TCP协议,不太会出现这种事情的吧。我也不是很懂
       stream.Write(data,0,read); } 
    //发送端也sleep一点时间
      

  3.   

    应该传递一个“起始位置”信息,然后接收端在do循环中每次仅接收1M即结束,然后接收端再重新开始接收下一个1M。接收端进程应该在即使意外崩溃时,也可以重新启动从文件尾开始断点续传接受。当接收信息不足1M,说明是最后一块。
      

  4.   

    程序是p2p的,放在不同的局域网不行,但是只要有一个是公网ip就可以实现,可以用内网ip的机子去连公网ip的机子,这样是找的到的,也可以运行。
    一楼说的方法可行,实现就是多个步骤。
    --------------------------------------------------------------------------------------------------------------------------------------------------
    --------------------------------------------------------------------------------------------------------------------------------------------------
    应该传递一个“起始位置”信息,然后接收端在do循环中每次仅接收1M即结束,然后接收端再重新开始接收下一个1M。接收端进程应该在即使意外崩溃时,也可以重新启动从文件尾开始断点续传接受。当接收信息不足1M,说明是最后一块。
    --------------------------------------------------------------------------------------------------------------------------------------------------
    --------------------------------------------------------------------------------------------------------------------------------------------------
    这种方式好理解,能否说明一下“起始位置”如何表示呢?如果接收端崩溃可以继续从文件尾接收,这段代码该如何实现?
      

  5.   

    其实原本我也想到的是这种方式来接收,但是奇怪的是,我发现在发送端还在继续发送的时候,接收端接收的数据在没有全部接收完的情况下就出现了接收不到1024的情况而提前退出while,所以造成了接收不完的情况。
    那我现在改成这样大家看看合理不
    首先发送一个要发送的文件的信息,文件大小
    然后直到本地接收到的数据等于要发送的文件大小位置,这个是外层的循环
    里面还有个循环,
    do 

      read=NetWorkStream.Read(data,0,1024); 
      stream.Write(data,0,read); 

    while(read >= 1024); 就用这个来做
    我的想法是,就算当内部的循环提前结束了,导致了接收的文件不满,到了外层循环发现文件不满又再次回来流中接收数据直到接收到的数据和发送的数据相符为止。
    当然,内部的循环要改写一下
    Stream stream = OpenWrite("路径");
    stream.seek=stream.length;加上这句,使得后续流都从文件尾写入。这样的方式可行不?
      

  6.   

    需要公网IP转发那就不叫P2P吧?