socket 多线程 文件传输

huing 2009-11-13 05:44:53
文件传输分以下2种
1 多个大文件上传
2 大文件下载 //这个我知道是在server端多线程
参考 :http://hi.baidu.com/hack95/blog/item/bc023e7a0c6a4ae72f73b367.html

有人说第1种情况没有必要,但如果是大文件上传,不也应该是分块上传会快一点?

请指教第1种情况的开发思路。
...全文
737 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanfuliang 2011-04-27
  • 打赏
  • 举报
回复
期待...
nzzb1985 2010-05-24
  • 打赏
  • 举报
回复
学习!
V68V6 2009-11-16
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 huing 的回复:]
楼上几位的建议都不错,最简单的实现方式是在server端布置一个ftpserver,但是现在情况就是server端不能自己设置(不能架ftpserver),而且client端还是要用winform的,所以才会去考虑用socket传输
[/Quote]

我估计你也是服务器端有限制,多半是不允许你开ftp服务的权限。。。。
huing 2009-11-16
  • 打赏
  • 举报
回复
正在看以下几个例子,多数是wcf的
File Transfer using WCF and Socket
http://www.codeproject.com/KB/webservices/wcftransfer.aspx

Sending Files in Chunks with MTOM Web Services and .NET 2.0
http://www.codeproject.com/KB/XML/MTOMWebServices.aspx

Progress Indication while Uploading/Downloading Files using WCF
http://www.codeproject.com/KB/WCF/WCF_FileTransfer_Progress.aspx

File Transfer using Socket Application in C#.Net 2
http://www.codeproject.com/KB/cs/SocketApplication.aspx

WCF TCP-based File Server
http://www.codeproject.com/KB/WCF/wcffileserver.aspx

SharpBITS.NET - wrapper for BITS API
http://www.codeproject.com/KB/IP/sharpBITS.aspx
shalen520 2009-11-16
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 xiaoyuer1985 的回复:]
分开传和一起传不都一样大的文件吗
[/Quote]

没错,不过同样多的一碗饭,一大口全吃下和小口小口吃,还是有分别的

因为一口吃下会噎死~
shalen520 2009-11-16
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 zcl24 的回复:]
用UDP会快一点
但是UDP需要很多转输中对数据正确性的验证。
[/Quote]

要实现可靠的UDP传输还是有点难度的,不过也不算太难
zcl24 2009-11-16
  • 打赏
  • 举报
回复
用UDP会快一点
但是UDP需要很多转输中对数据正确性的验证。
huing 2009-11-16
  • 打赏
  • 举报
回复
周3来结贴
huing 2009-11-16
  • 打赏
  • 举报
回复
差不多就是要自己写一个仿FTP程序
huing 2009-11-16
  • 打赏
  • 举报
回复
楼上几位的建议都不错,最简单的实现方式是在server端布置一个ftpserver,但是现在情况就是server端不能自己设置(不能架ftpserver),而且client端还是要用winform的,所以才会去考虑用socket传输
Taiyangchen 2009-11-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 qldsrx 的回复:]
其实多线程文件上传下载不难,只要你解决了文件断点续传的问题,多线程上传下载自然不是问题,更不用说什么大文件了。

几个月前本来也想写一个高效仿FTP程序的,但是时间不够,最后程序写了一半停下了,主要是技术不过关,定义协议和分配内存上把握不好。不过后来我用WCF实现了文件分段压缩传输,速度比普通传输快上30倍左右。
[/Quote]up
cqsfd 2009-11-13
  • 打赏
  • 举报
回复
也来帮你顶下贴

楼主真幸福,这么多高人来指点
悔说话的哑巴 2009-11-13
  • 打赏
  • 举报
回复
呵呵 老妖的不错
xiaoyuer1985 2009-11-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 shalen520 的回复:]
引用 3 楼 huing 的回复:
假设对每一个连接的速度有限制呢?(单线程不能充分利用带宽)

该如何实现多线程上传?


按一定大小,分块,编号

用线程池,使用N个线程,每个线程传一块传,传完一块服务器确认已经收到就从队列中移除并写日志

问题的关键就是要自己定好控制协议,比如传递块数,块编号,计算校验值 等等;

另外要注意将控制流和数据流分离

做的更精细一些,还要考虑充分利用每个数据包的载荷,数据压缩等问题...
[/Quote]
分开传和一起传不都一样大的文件吗
V68V6 2009-11-13
  • 打赏
  • 举报
回复
tiandiyouwo1 2009-11-13
  • 打赏
  • 举报
回复
up
V68V6 2009-11-13
  • 打赏
  • 举报
回复
LZ为什么要走socket协议的路子?

File Transfer using WCF and Socket

shalen520 2009-11-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 huing 的回复:]
假设对每一个连接的速度有限制呢?(单线程不能充分利用带宽)

该如何实现多线程上传?
[/Quote]

按一定大小,分块,编号

用线程池,使用N个线程,每个线程传一块传,传完一块服务器确认已经收到就从队列中移除并写日志

问题的关键就是要自己定好控制协议,比如传递块数,块编号,计算校验值 等等;

另外要注意将控制流和数据流分离

做的更精细一些,还要考虑充分利用每个数据包的载荷,数据压缩等问题...
绝代坏坏 2009-11-13
  • 打赏
  • 举报
回复
顶六楼的
shalen520 2009-11-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 huing 的回复:]
引用 2 楼 agentianle 的回复:
“但如果是大文件上传,不也应该是分块上传会快一点?”

呵呵,大文件分块之后还是大文件吗?


只是上传的时候分开,在server端吧数据接收完后,byte[0]+byte[1]后再生成文件,
[/Quote]

呃,大文件用 byte[]+...然后写文件,不怕OOM?

fs.seek;
fs.write;

比较好吧,还可以实现断点续传
加载更多回复(6)

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧