欢迎光临
我们一直在努力

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<string> strings = new List<string>();

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<string> strings = new List<string>();
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<string> 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文件传输系统展示了如何实现一个完整的网络文件传输解决方案。系统采用了多线程、分块传输、二进制通信等关键技术,提供了稳定高效的文件传输能力。代码结构清晰,异常处理完善,具有良好的可扩展性,可以作为企业级文件传输系统的基础框架。

    赞(0)
    未经允许不得转载:171主机测评 » C# TCP文件传输系统实现详解(服务器与客户端实现)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址