大家好 我是一名大四的学生 最近在做“大文件上传”的毕设 遇到点问题 请求大家的帮助我先给大家简单说一下 毕设题目是利用asp.net+c# 完成一个bs模式下的局域网文件上传/下载,上传后写入后台数据库
近期上网查了查资料确定了一下方案
建立tcpclient类(客户端)和tcplisten类(服务器),数据库和服务器在本机,客户端在局域网中
client和server通过networkstream通信 由于是大文件 所以要将文件分块传输(二进制数组)
然后server整合 写入数据库(下载和上传差不多)
因为刚接触c#,所以流和多线程不是很懂
在提高效率方面遇到了如下问题1. 一个tcplisten能否同时连接多个tcpclient的请求?因为要提高效率,所以能做到同时发送文件块那样将极大的提高效率
2. 如果server能够连接多个client,那么networkstream是对应于每一个client么?如果是,server又该怎么做才能正确的接受每一个文件块.我想到达顺序应该不重要,只要在文件块前面加入次序即可解决.如果networkstream只有一个,我不清楚如何操作才能保证server从networkstream中接受多个文件块.
3. networkstream是否支持同时写入/读出?我应该创建n个client通过networkstream与server通信;还是创建一个client,通过对networkstream操作,保证server能高效的接收多个文件块.
4. 看了看networkstream的异步读写,不懂是什么意思.请大家给我说说,最好有例子之类的最近学校盛传因为奥运会提前答辩,所以剩余时间不多.一定请大家多帮帮忙
小弟在这里深表感谢

解决方案 »

  1.   

    使用Socket吧...
    1. TcpListener 是可以接受多个Client连接的, 你可以用异步接发. 不过个人还是比较喜欢用一个ClientPool来进行对每一个Client放到一个自己的Thread里。
    2. 是的, 每一个Client和Server的连接都拥有自己的的一个NetworkStream.如果想知道要接收多少字节的话,我建议自定义自己的传送Header.
    3. 如果想提高效率使用Socket, Thread. .....
    4. BeginReceive(), EndReceive(), BeginAccept(), EndAccept(); 或者使用Receive(), Accept() 在一个单独的Thread里。最后一个问题.................. 这个ASP .NET有什么直接的关系? 还是不明白你想要怎么做.
      

  2.   

    网页应用程序 + 服务器 + 后台数据库等于说我要实现在asp中的fileupload这个控件,能实现大文件的上传和下载您说的socket我不是很清楚 我再看看这方面的资料吧您能不能给我详细说说您的思路
      

  3.   

    如果使用Socket的话:
    每一个Session都拥有自己的一个上传Socket.在“上传”点击时候,
    确认文件存在。
    获取文件信息。 然后记录到你的Session里的一个object里。例如:
    public struct UploadHeader
    {
      public string filename;  //文件名
      public long filelength;  //文件的长度in bytes 1MB = 1024KB; 1KB = 1024 bytes.
      public long current_pos;   //你的Socket接受到的位置, 可能需要当你希望可以有续传的时候.
      public string clientName;  //上传的用户名.
    }Session["UploadHeander"] = new UploadHeader();
    //
    先分析文件的信息。 
    然后利用Socket开始传送.
    当在传续中网络中断的时候, 记录下最后的一个current_pos。 在同一个用户下次上载同一个文件的时候,从current_pos开始接受数据.