C# TCP文件传输系统实现详解(服务器与客户端实现)
概述
本文介绍了一个完整的C# TCP文件传输系统,包含服务器端和客户端实现。该系统能够通过TCP协议在客户端和服务器之间传输文件和目录结构,支持多线程处理和分块传输大文件。


系统架构
1. 服务器端功能
服务器启动模块
private void btnStart_Click(object sender, EventArgs e)
{
try
{
_isRunning = true;
tcpListener = new TcpListener(IPAddress.Any, 5000);
listenerThread = new Thread(ListenClients);
listenerThread.Start();
LogMessage($"存储路径: {ServerBasePath}");
LogMessage("服务器已启动");
MessageBox.Show("服务器已启动");
}
catch (Exception ex)
{
LogError($"启动失败: {ex.Message}");
}
}
客户端连接监听
private void ListenClients()
{
try
{
tcpListener.Start();
while (_isRunning)
{
var client = tcpListener.AcceptTcpClient();
ThreadPool.QueueUserWorkItem(HandleClient, client);
}
}
catch (SocketException ex) when (!_isRunning)
{
// 正常停止时的异常处理
}
catch (Exception ex)
{
// 异常处理
}
}
客户端请求处理
private void HandleClient(object state)
{
using (var client = (TcpClient)state)
using (var stream = client.GetStream())
{
BinaryReader reader = new BinaryReader(stream);
BinaryWriter writer = new BinaryWriter(stream);
List strings = new List();
try
{
// 处理文件传输和目录创建逻辑
// ...
}
catch (Exception ex)
{
LogError($"处理错误: {ex.Message}");
}
}
}
2. 客户端功能
文件发送启动
private void btnSend_Click(object sender, EventArgs e)
{
string path = txtDirectoryPath.Text;
if (!Directory.Exists(path))
{
MessageBox.Show("目录不存在");
return;
}
new Thread(() => SendSelectedItems(txtIP.Text)).Start();
MessageBox.Show("发送成功");
}
选择文件发送
private void SendSelectedItems(string serverIP)
{
try
{
List strings = new List();
var checkedItems = this.treeListView.CheckedObjects;
ListViewItem firstRow = this.treeListView.Items[0];
string name = firstRow.Text;
foreach (var item in checkedItems)
{
var myItem = item as MyFileSystemInfo;
bool exists = myItem.FullName.Contains(name);
if (exists)
{
strings.Add(myItem.FullName);
}
}
using (TcpClient client = new TcpClient(serverIP, 5000))
using (NetworkStream stream = client.GetStream())
{
BinaryWriter writer = new BinaryWriter(stream);
BinaryReader reader = new BinaryReader(stream);
// 递归发送所有文件
SendFiles(strings, name, writer);
// 发送结束标记
writer.Write("EOF");
// 等待服务器响应
string response = reader.ReadString();
ShowStatus($"服务器响应: {response}");
}
}
catch (Exception ex)
{
ShowStatus($"传输失败: {ex.Message}");
}
}
文件传输实现
private void SendFiles(List filePath, string name, BinaryWriter writer)
{
bool state = false;
for (int i = 0; i < filePath.Count; i++)
{
string fileName = Path.GetFileName(filePath[i]);
string actualExtension = Path.GetExtension(fileName);
if (actualExtension.StartsWith("."))
{
// 发送文件
FileInfo fi = new FileInfo(filePath[i]);
writer.Write("File");
writer.Write(filePath[i]);
writer.Write(fileName);
writer.Write(fi.Length);
// 分块发送文件内容
using (FileStream fs = File.OpenRead(filePath[i]))
{
byte[] buffer = new byte[4096];
int read;
while ((read = fs.Read(buffer, 0, buffer.Length)) > 0)
{
writer.Write(buffer, 0, read);
}
}
}
else
{
// 发送目录信息
if (state == false)
{
writer.Write(name);
state = true;
}
writer.Write(fileName);
writer.Write(filePath[i]);
}
}
}
技术特点
1. 多线程处理
-
服务器使用线程池处理多个客户端连接
-
客户端使用独立线程进行文件传输,避免界面冻结
2. 高效文件传输
-
采用分块传输机制,支持大文件传输
-
使用4096字节的缓冲区优化传输效率
-
二进制读写提高数据传输速度
3. 目录结构保持
-
客户端发送完整的文件路径信息
-
服务器端重建原始目录结构
-
支持同时传输多个文件和目录
4. 通信协议设计
-
使用特定的标记("File", "EOF")区分数据类型
-
包含文件元数据(文件名、大小)和内容数据
-
支持双向通信和状态反馈
5. 错误处理机制
-
完善的异常捕获和处理
-
网络异常的特殊处理
-
用户友好的错误提示
使用流程
-
启动服务器
-
设置存储路径
-
点击启动按钮开始监听端口5000
-
-
客户端配置
-
输入要发送的目录路径
-
输入服务器IP地址
-
选择要发送的文件或目录
-
-
开始传输
-
点击发送按钮启动传输过程
-
系统自动处理文件分块和传输
-
显示传输状态和服务器响应
-
-
传输完成
-
服务器接收所有文件并重建目录结构
-
客户端显示传输成功消息
-
服务器界面更新文件树显示
-
性能优化建议
-
增加传输压缩:在传输前对文件进行压缩
-
实现断点续传:支持传输中断后从中断点继续
-
添加加密传输:保障数据传输的安全性
-
优化内存管理:使用内存池减少GC压力
-
增加进度显示:实时显示传输进度和速度
总结
这个C# TCP文件传输系统展示了如何实现一个完整的网络文件传输解决方案。系统采用了多线程、分块传输、二进制通信等关键技术,提供了稳定高效的文件传输能力。代码结构清晰,异常处理完善,具有良好的可扩展性,可以作为企业级文件传输系统的基础框架。









