c# socket传送大文件分享代码。

小范f-li.cn 2010-05-31 05:14:43
这里贴核心部分。

using System;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Text;

namespace FileSender
{
public static class FileSender
{
private const int BufferSize = 1024;

public static void Send(IPEndPoint ip, string path)
{
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sock.Connect(ip);
using (FileStream reader = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None))
{
long send = 0L, length = reader.Length;
sock.Send(BitConverter.GetBytes(length));
string fileName = Path.GetFileName(path);
sock.Send(Encoding.Default.GetBytes(fileName));
Console.WriteLine("Sending file:" + fileName + ".Plz wait...");
byte[] buffer = new byte[BufferSize];
int read, sent;
//断点发送 在这里判断设置reader.Position即可
while ((read = reader.Read(buffer, 0, BufferSize)) != 0)
{
sent = 0;
while ((sent += sock.Send(buffer, sent, read, SocketFlags.None)) < read)
{
send += (long)sent;
//Console.WriteLine("Sent " + send + "/" + length + ".");//进度
}
}
Console.WriteLine("Send finish.");
}
}

public static void Receive(IPEndPoint ip, string path)
{
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sock.Bind(ip);
sock.Listen(1);
Socket client = sock.Accept();
byte[] buffer = new byte[BufferSize];
client.Receive(buffer);
long receive = 0L, length = BitConverter.ToInt64(buffer, 0);
string fileName = Encoding.Default.GetString(buffer, 0, client.Receive(buffer));
Console.WriteLine("Receiveing file:" + fileName + ".Plz wait...");
using (FileStream writer = new FileStream(Path.Combine(path, fileName), FileMode.Create, FileAccess.Write, FileShare.None))
{
int received;
//断点接受 在这里判断设置writer.Position即可
while (receive < length)
{
received = client.Receive(buffer);
writer.Write(buffer, 0, received);
writer.Flush();
receive += (long)received;
//Console.WriteLine("Received " + receive + "/" + length + ".");//进度
}
}
Console.WriteLine("Receive finish.");
}
}
}


代码见 http://download.csdn.net/source/2413127
...全文
1250 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
ikm963 2012-08-04
  • 打赏
  • 举报
回复
加群117271157
ipone、ASP.NET、AJAX、C#、ASP.NET MVC等
qidongxi2012 2012-03-24
  • 打赏
  • 举报
回复
很有实用价值,分享了,多谢!
huwen7565833 2010-06-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 w395115323 的回复:]
刚测试传4G的文件通过。
[/Quote]
传4G的文件需要多长时间,重点是传输的速度。楼主可以考虑考虑多线程分割传输的方法。还有如果我多个客户端同时传输的话,又会出现什么问题呢!!
期待楼主的佳作!
huwen7565833 2010-06-03
  • 打赏
  • 举报
回复
谢谢楼主的分享!
小范f-li.cn 2010-05-31
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 jiezi316 的回复:]
我的意思是传输的时候多线程多通道传输。刚才没有说清楚。
[/Quote]
你的意思是 比如2K的文件 弄2个线程 每个线程同时发1K? 接受也同理?
是这个意思?
jsonzbc 2010-05-31
  • 打赏
  • 举报
回复
谢谢分享,收藏了
deknight 2010-05-31
  • 打赏
  • 举报
回复
mark
zzxap 2010-05-31
  • 打赏
  • 举报
回复
多线程 一边读取一边发送比较好
jiezi316 2010-05-31
  • 打赏
  • 举报
回复
我的意思是传输的时候多线程多通道传输。刚才没有说清楚。
myhope88 2010-05-31
  • 打赏
  • 举报
回复
真不错,多谢分享
小范f-li.cn 2010-05-31
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jiezi316 的回复:]
谢谢分享,最好能多线程那种就好了。
[/Quote]
调用的时候弄成多线程不就行了。。。


测试环境:win2003+.net3.5
硬件:2核+2G
发送和接送公用 CPU40%左右 内存使用稳定在8000+K
四更山吐月 2010-05-31
  • 打赏
  • 举报
回复
很好,收藏了!多谢。
hyblusea 2010-05-31
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 w395115323 的回复:]
刚测试传4G的文件通过。
[/Quote]

不错,收藏了
小范f-li.cn 2010-05-31
  • 打赏
  • 举报
回复
刚测试传4G的文件通过。
snowkingdom 2010-05-31
  • 打赏
  • 举报
回复
谢谢分享
jiezi316 2010-05-31
  • 打赏
  • 举报
回复
谢谢分享,最好能多线程那种就好了。
Alden 2010-05-31
  • 打赏
  • 举报
回复
谢谢分享
捷哥1999 2010-05-31
  • 打赏
  • 举报
回复
不错,接分了,沙发

111,095

社区成员

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

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

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