public class ClassMsg
{
        public String sendkind="";//标识发送状态,如果是"start",表示要准备发送,如果是"sending",说明数据已经开始在发了,如果是"end",说明发完了,start和end时Data是空数据,数据只在sending状态发送          public String FileName = "";//文件名        public byte[] Data;//文件转化成byte[]流,并且切成很多份
  }
服务器通过socket不停的发送一个对象ClassMsg到客户端来传送一份文件,
客户端在接受的时候:
分3部写:switch(ClassMsg.sendkind)
{
case start:
   {
   FileStream fs= File.Create(ClassMsg.FileName);//新建文件名为FileName的文件
   break;
   }
case sending:
 {
  FileStream fs=File.OpenWrite(ClassMsg.FileName);//将本地未接受完的文件载入到fs中
  fs.Seek(0, SeekOrigin.End);//将该流的当前位值设为0
  fs.Write(ClassMsg.Data, 0, ClassMsg.Data.Length);//向文件中写入当前接收的信息
  break;
 }
case end:
{
  this.textbox1.text="收到新文件:"+ClassMsg.FileName;
  break;
}
}按照我上面写的,因为每次接受到数据都新建了一个空白的fs,将接受的数据写到相应文件名的文件中,这样比较灵活,可以同时几个人一起传文件,反正fs中没有残留信息,但是问题也出现了,在接受的过程中,每次新建fs,fs还得从机器上载入未传完的文件,文件超过600K的时候,好像载入的非常慢,载入的数据跟不上服务器向客户端发送数据包的速度,然后后面的数据就丢失了,整份文件只传了600K怎么解决?

解决方案 »

  1.   

    对,  我用一次 就关闭一次的。忘了写出来了,多谢提醒
    在start和sending的时候 ,用完都fs.close();的问题依旧
      

  2.   

    我data[]的大小是1024个,也就是1K的数据
    如果我发送600K以下的数据,很顺利,但是超过600K的,数据就丢失了我个人感觉是FileStream fs=File.OpenWrite(...);的速度跟不上,服务器socket过来的速度,socket过来的数据又没在内存中保存进行异步读取,服务器不管客户端读取速度跟不跟的上,反正盲目的发数据包
      

  3.   

    用多线程来处理 得到的每一个请求 都开一个线程来进行写文件操作
    ThreadPool.QueueUserWorkItem(delegate {调用写文件方法 });
    然后在获取流的时候 循环读取 将大于1024的情况也考虑进去!
      

  4.   

    其实很多时候这种“服务器、客户端”的说法我看着很诧异。按照tcp通讯,凡是作为监听的就叫做服务器,而服务器完全可以同时也作为客户端。所以你叫做客户端的机器,它在一个任务中其实是服务器;而你叫做服务器的机器,此时其实是客户端。
    单机上“开发”就容易这样瞎试。你仔细想一下就能想出一种测试用例,网络差一些,或者某台机器忙一些,不可能盲目匹配上处理速率。更何况你的接收数据的那一端根本没有验证data的偏移地址,而是盲目地放到文件尾去写,这样如何能够检测出丢失的data?实际上真正的传文件,每传送一小块数据都需要确认,发送端没有收到确认则需要重发,重发许多次之后还没有收到确认则传输失败。不要被网上的某些幼稚的socket的“范例”给骗了。你仔细想一想,想好“协议”,不要简单化。
      

  5.   

    另外,似乎你的所谓客户端只是被一个服务器推送文件似的,这也很可能是协议设计中的一个bug。