大家好 我是一名大四的学生 最近在做“大文件上传”的毕设 遇到点问题 请求大家的帮助我先给大家简单说一下 毕设题目是利用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的异步读写,不懂是什么意思.请大家给我说说,最好有例子之类的最近学校盛传因为奥运会提前答辩,所以剩余时间不多.一定请大家多帮帮忙
小弟在这里深表感谢
近期上网查了查资料确定了一下方案
建立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. TcpListener 是可以接受多个Client连接的, 你可以用异步接发. 不过个人还是比较喜欢用一个ClientPool来进行对每一个Client放到一个自己的Thread里。
2. 是的, 每一个Client和Server的连接都拥有自己的的一个NetworkStream.如果想知道要接收多少字节的话,我建议自定义自己的传送Header.
3. 如果想提高效率使用Socket, Thread. .....
4. BeginReceive(), EndReceive(), BeginAccept(), EndAccept(); 或者使用Receive(), Accept() 在一个单独的Thread里。最后一个问题.................. 这个ASP .NET有什么直接的关系? 还是不明白你想要怎么做.
每一个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开始接受数据.