"C#超大文件发送与接收代码提供了在C#环境下处理大文件传输的实现示例,包括创建线程发送文件、设置Socket缓冲区大小以及分块传输文件的逻辑。" 在C#编程中,处理超大文件的发送与接收是一项常见的任务,特别是在网络应用中。此代码示例展示了如何有效地进行这项操作。以下是关键知识点的详细说明: 1. **线程处理**: - 使用`Thread`类创建一个新的线程来执行文件发送操作,这样可以将文件传输与用户界面(UI)操作分离,避免阻塞UI线程,提高用户体验。`startSendFileThread`方法创建了一个新线程并启动了`sendFile`方法。 2. **Socket通信**: - `Socket`类是C#中用于网络通信的基础,它提供了TCP/IP套接字的低级访问。`socketClient`实例化了一个新的Socket,使用了`InterNetwork`地址族,`Stream`套接字类型,以及`Tcp`协议类型,以支持面向连接的TCP服务。 - 设置`SendBufferSize`和`ReceiveBufferSize`属性为10MB(1024*1024*10字节),以优化数据传输速度和效率,减少系统因缓冲区过小而导致的数据丢失。 - 使用`Connect`方法连接到指定的服务器IP和端口,确保客户端与服务器间的连接建立。 3. **文件读取**: - `FileStream`类用于读取和写入文件。在这里,它以只读模式打开文件,并获取文件长度,以便后续的分块传输。 4. **分块传输**: - 为了处理超大文件,文件被分成固定大小的块(例如,每块100KB)。这有助于避免一次性加载整个大文件到内存中,减少了内存消耗。 - 使用一个循环来逐块发送文件,直到发送完整个文件。在每次循环中,计算当前块的大小(如果最后一块小于100KB,则调整为实际大小)。 - 使用`offset`变量跟踪已发送的数据量,`partSize`变量表示当前块的大小。 5. **异常处理**: - 对于可能发生的异常,如`SocketException`,进行了捕获和处理,以便在连接失败时给出相应的错误信息。 6. **安全性与性能优化**: - 尽管代码没有显示,但在实际应用中,应该考虑添加错误恢复机制,如重试或断点续传,以确保文件传输的可靠性。 - 另外,关闭和释放资源(如`FileStream`和`Socket`)是非常重要的,以防止资源泄漏。 通过以上这些技术,可以实现高效、可靠的超大文件发送与接收功能,同时保持程序的稳定性和用户体验。
public void startSendFileThread() {
try
{
Thread sendFileThread = new Thread(new ThreadStart(sendFile));
sendFileThread.Start();
}
catch {
MessageBox.Show("线程开启或线程发送过中遇到问题失败。。。。。。");
this.sendFlag = false;
}
finally
{
}
}
public void sendFile()
{
public Socket socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(userIP),userPort);
try
{
//因为客户端只是用来向特定的服务器发送信息,所以不需要绑定本机的IP和端口。不需要监听。
socketClient.SendBufferSize = 1024 * 1024*10;
socketClient.ReceiveBufferSize = 1024 * 1024*10;
socketClient.Connect(ipep);
// MessageBox.Show("connected!!");
}
catch (SocketException e)
{
Console.WriteLine("unable to connect to server");
}
FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
int partSize = 1024 * 100;
long fileLength = fs.Length;
long offset = 0;
while (true)
{
if (offset + partSize >=fileLength)
partSize = Convert.ToInt32(fileLength - offset);
byte[] temp = new byte[partSize];
fs.Position = offset;
fs.Read(temp, 0, partSize);
socketClient.Send(temp, temp.Length, SocketFlags.None);//将数据发送到指定的终结点
// myControl.TraFransfersSize += partSize;
if (offset + partSize >= fileLength)
break;
offset += partSize;
}
//myChat.Rich_Out.AppendText("发送完成: " + fileName + "\n");
socketClient.Shutdown( SocketShutdown.Both);
socketClient.Close();
// myChat.RemoveFileInfoFromControl(fileName);
}
接收端部分代码:
public void Listener() //监听 本地端口 5421
{
if (classTCPSocket == null)
classTCPSocket = new ClassTCPSocket(5421);
剩余6页未读,继续阅读
- 粉丝: 52
- 资源: 6
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C++标准程序库:权威指南
- Java解惑:奇数判断误区与改进方法
- C++编程必读:20种设计模式详解与实战
- LM3S8962微控制器数据手册
- 51单片机C语言实战教程:从入门到精通
- Spring3.0权威指南:JavaEE6实战
- Win32多线程程序设计详解
- Lucene2.9.1开发全攻略:从环境配置到索引创建
- 内存虚拟硬盘技术:提升电脑速度的秘密武器
- Java操作数据库:保存与显示图片到数据库及页面
- ISO14001:2004环境管理体系要求详解
- ShopExV4.8二次开发详解
- 企业形象与产品推广一站式网站建设技术方案揭秘
- Shopex二次开发:触发器与控制器重定向技术详解
- FPGA开发实战指南:创新设计与进阶技巧
- ShopExV4.8二次开发入门:解决升级问题与功能扩展