当前位置: 首页 > news >正文

C# TCP的方式 实现上传文件

以下是基于C#的TCP文件上传功能的完整实现代码,包含服务端和客户端的关键实现细节。代码采用分块传输机制,支持大文件传输,并包含必要的异常处理和资源管理。


服务端代码实现

using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;public class FileServer
{private const int Port = 12345;private const int BufferSize = 81920; // 80KB缓冲区public static void StartServer(){TcpListener listener = new TcpListener(IPAddress.Any, Port);listener.Start();Console.WriteLine($"服务器已启动,等待客户端连接...");try{using (TcpClient client = listener.AcceptTcpClient()){Console.WriteLine("客户端已连接。");NetworkStream stream = client.GetStream();// 读取文件信息头(文件名+文件大小)byte[] headerBuffer = new byte[1024];int headerBytesRead = stream.Read(headerBuffer, 0, headerBuffer.Length);string fileInfo = Encoding.UTF8.GetString(headerBuffer, 0, headerBytesRead);string[] infoParts = fileInfo.Split('|');string fileName = infoParts[0];long fileSize = long.Parse(infoParts[1]);// 创建保存路径string savePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, fileName);using (FileStream fileStream = new FileStream(savePath, FileMode.Create, FileAccess.Write)){byte[] buffer = new byte[BufferSize];long totalReceived = 0;int bytesRead;while (totalReceived < fileSize &&(bytesRead = stream.Read(buffer, 0, (int)Math.Min(buffer.Length, fileSize - totalReceived))) > 0){fileStream.Write(buffer, 0, bytesRead);totalReceived += bytesRead;Console.WriteLine($"已接收: {totalReceived}/{fileSize} 字节 ({(totalReceived * 100 / fileSize)}%)");}}Console.WriteLine("文件接收完成。");}}catch (Exception ex){Console.WriteLine($"错误: {ex.Message}");}finally{listener.Stop();}}
}

客户端代码实现

using System;
using System.IO;
using System.Net.Sockets;
using System.Text;public class FileClient
{private const string ServerIP = "127.0.0.1";private const int Port = 12345;private const int BufferSize = 81920; // 80KB缓冲区public static void UploadFile(string filePath){if (!File.Exists(filePath)){Console.WriteLine("文件不存在!");return;}FileInfo fileInfo = new FileInfo(filePath);long fileSize = fileInfo.Length;try{using (TcpClient client = new TcpClient()){client.Connect(ServerIP, Port);NetworkStream stream = client.GetStream();// 发送文件信息头(文件名|文件大小)string header = $"{fileInfo.Name}|{fileSize}";byte[] headerBytes = Encoding.UTF8.GetBytes(header);stream.Write(headerBytes, 0, headerBytes.Length);// 分块发送文件数据using (FileStream fileStream = File.OpenRead(filePath)){byte[] buffer = new byte[BufferSize];int bytesRead;long totalSent = 0;while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) > 0){stream.Write(buffer, 0, bytesRead);totalSent += bytesRead;Console.WriteLine($"已发送: {totalSent}/{fileSize} 字节 ({(totalSent * 100 / fileSize)}%)");}}}Console.WriteLine("文件上传完成。");}catch (Exception ex){Console.WriteLine($"错误: {ex.Message}");}}
}

关键功能说明

  1. 文件信息头传输
    客户端在发送文件前,先发送包含文件名和文件大小的头部信息(格式:文件名|文件大小),服务端解析后创建目标文件。此设计避免了大文件内存占用过高的问题。

  2. 分块传输机制
    使用固定大小缓冲区(如80KB)分块读写文件,避免一次性加载大文件导致内存溢出,同时支持断点续传扩展。

  3. 异常处理
    包含网络中断、文件不存在等异常捕获,确保程序健壮性。

  4. 进度显示
    实时显示传输进度百分比,提升用户体验。


使用示例

// 服务端启动
FileServer.StartServer();// 客户端上传文件
FileClient.UploadFile("C:\\test\\largefile.zip");

扩展建议

  1. 断点续传
    可在服务端记录已接收的字节数,客户端支持从断点处继续发送(需在头部增加校验和字段)。

  2. 异步传输
    使用BeginRead/BeginWriteasync/await优化性能,避免阻塞主线程。

  3. 加密传输
    添加TLS/SSL加密层,保障传输安全性。

  4. 多线程处理
    服务端支持同时处理多个客户端连接,提升并发能力。


以上代码可满足基础文件传输需求。实际应用中需根据具体场景调整缓冲区大小、超时设置等参数。

http://www.dtcms.com/a/391496.html

相关文章:

  • 高压消解罐:难溶物质消解的首选工具
  • JavaScript 字符串截取最后一位的几种方法
  • MobileNetV3训练自定义数据集并通过C++进行推理模型部署
  • nvshmem源码学习(一)ibgda视角的整体流程
  • Redis群集的三种模式
  • 鸿蒙(南向/北向)
  • Spring IoCDI 快速入门
  • MySQL的C语言驱动核心——`mysql_real_connect()` 函数
  • C++线程池学习 Day06
  • React 样式CSS的定义 多种定义方式 前端基础
  • react+anddesign组件Tabs实现后台管理系统自定义页签头
  • Midscene 低代码实现Android自动化
  • ADB使用指南
  • FunCaptcha如何查找sitekey参数
  • 大模型如何让机器人实现“从冰箱里拿一瓶可乐”?
  • Python实现液体蒸发优化算法 (Evaporation Rate Water Cycle Algorithm, ER-WCA)(附完整代码)
  • MySQL 数据库的「超级钥匙」—`mysql_real_connect`
  • LeetCode 每日一题 3484. 设计电子表格
  • RAGAS深度解析:引领RAG评估新时代的开源技术革命
  • aave v3.4 利率计算详解
  • rook-ceph CRD资源配置时效问题
  • MySQL学习笔记-进阶篇
  • Rust 关键字
  • 排版使用latex排版还是word排版更容易通过mdpi remote sensing的审稿?
  • Qt QML ToolTip弹出方向控制问题探讨
  • [Windows] PDFQFZ(PDF加盖骑缝章) v1.31
  • 四网络层IP-子网掩码-路由表-真题
  • 安装QT6.9.2
  • 使用 NodePort
  • IP6163至为芯具备MPPT硬件算法的太阳能光伏降压DC-DC芯片