基于C#实现TCP/UDP通信及文件传输的示例

 更新时间:2026年03月12日 10:18:23   作者:yong9990  
本文主要介绍了基于C#实现TCP/UDP通信及文件传输的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、TCP通信实现

1. 服务器端(文件传输)

using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;

public class TcpFileServer {
    private const int Port = 12345;
    private const string BufferSize = 8192;

    public static void Start() {
        using (TcpListener listener = new TcpListener(IPAddress.Any, Port)) {
            listener.Start();
            Console.WriteLine($"服务器已启动,等待连接...");

            using (TcpClient client = listener.AcceptTcpClient())
            using (NetworkStream stream = client.GetStream()) {
                // 接收文件信息
                byte[] fileInfo = new byte[1024];
                int bytesRead = stream.Read(fileInfo, 0, fileInfo.Length);
                string fileName = Encoding.UTF8.GetString(fileInfo, 0, bytesRead).TrimEnd('\0');

                // 接收文件数据
                using (FileStream fs = new FileStream($"received_{fileName}", FileMode.Create)) {
                    byte[] buffer = new byte[BufferSize];
                    int totalBytes = 0;
                    while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0) {
                        fs.Write(buffer, 0, bytesRead);
                        totalBytes += bytesRead;
                        Console.WriteLine($"已接收: {totalBytes}字节");
                    }
                }
            }
        }
    }
}

2. 客户端(文件传输)

public class TcpFileClient {
    public static void SendFile(string filePath, string serverIp) {
        using (TcpClient client = new TcpClient(serverIp, 12345))
        using (NetworkStream stream = client.GetStream()) {
            // 发送文件信息
            byte[] fileName = Encoding.UTF8.GetBytes(Path.GetFileName(filePath));
            stream.Write(fileName, 0, fileName.Length);

            // 发送文件数据
            using (FileStream fs = new FileStream(filePath, FileMode.Open)) {
                byte[] buffer = new byte[8192];
                int bytesRead;
                while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0) {
                    stream.Write(buffer, 0, bytesRead);
                }
            }
        }
    }
}

二、UDP通信实现

1. 实时数据传输(无连接)

public class UdpRealTime {
    private const int Port = 54321;
    private static UdpClient udpServer = new UdpClient(Port);

    public static void Start() {
        IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0);
        Console.WriteLine("UDP服务器已启动...");

        while (true) {
            byte[] received = udpServer.Receive(ref remoteEP);
            string message = Encoding.UTF8.GetString(received);
            Console.WriteLine($"收到来自 {remoteEP}: {message}");

            // 回显响应
            udpServer.Send(Encoding.UTF8.GetBytes("ACK"), 3, remoteEP);
        }
    }
}

// 客户端
public class UdpClientApp {
    public static void Send(string message, string serverIp) {
        using (UdpClient client = new UdpClient()) {
            IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse(serverIp), 54321);
            byte[] data = Encoding.UTF8.GetBytes(message);
            client.Send(data, data.Length, remoteEP);
            
            // 接收回显
            IPEndPoint sendEP = new IPEndPoint(IPAddress.Any, 0);
            byte[] response = client.Receive(ref sendEP);
            Console.WriteLine($"服务器响应: {Encoding.UTF8.GetString(response)}");
        }
    }
}

三、文件传输增强方案

1. 断点续传支持

// 服务器端扩展
public class ResumableTcpServer {
    public static void ResumeTransfer(TcpClient client) {
        using (NetworkStream stream = client.GetStream()) {
            // 获取已传输字节数
            byte[] resumeInfo = new byte[8];
            stream.Read(resumeInfo, 0, 8);
            long startPosition = BitConverter.ToInt64(resumeInfo, 0);

            // 从断点处继续写入
            using (FileStream fs = new FileStream("resumed_file.dat", FileMode.Append)) {
                fs.Seek(startPosition, SeekOrigin.Begin);
                // 继续接收数据...
            }
        }
    }
}

// 客户端扩展
public class ResumableTcpClient {
    public static void SendWithResume(string filePath) {
        FileInfo fi = new FileInfo(filePath);
        long fileSize = fi.Length;
        
        // 发送文件信息(含总大小)
        using (TcpClient client = new TcpClient("127.0.0.1", 12345)) {
            NetworkStream stream = client.GetStream();
            byte[] sizeBytes = BitConverter.GetBytes(fileSize);
            stream.Write(sizeBytes, 0, sizeBytes.Length);

            // 断点续传逻辑
            using (FileStream fs = new FileStream(filePath, FileMode.Open)) {
                fs.Seek(0, SeekOrigin.Begin); // 实际应用中需读取已传输位置
                byte[] buffer = new byte[8192];
                int bytesRead;
                while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0) {
                    stream.Write(buffer, 0, bytesRead);
                }
            }
        }
    }
}

四、协议对比与选型建议

特性TCPUDP
连接方式面向连接无连接
可靠性保证送达、顺序、完整性不保证
传输效率较低(有握手和确认机制)高(无额外开销)
适用场景文件传输、Web服务实时音视频、在线游戏、DNS查询
典型实现类TcpListener/TcpClientUdpClient

五、安全增强措施

  1. SSL/TLS加密

    using (SslStream sslStream = new SslStream(stream, false)) {
        SslStream.AuthenticateAsServer(serverCertificate);
        await sslStream.WriteAsync(encryptedData);
    }
    
  2. 数据校验

    // 添加CRC32校验
    public byte[] AddChecksum(byte[] data) {
        using (var crc32 = new CRC32()) {
            byte[] checksum = crc32.ComputeHash(data);
            return checksum.Concat(data).ToArray();
        }
    }
    

六、完整项目结构示例

SocketApp/
├── Server/
│   ├── TcpServer.cs
│   ├── UdpServer.cs
│   └── FileTransferHandler.cs
├── Client/
│   ├── TcpClient.cs
│   ├── UdpClient.cs
│   └── FileSender.cs
├── Common/
│   ├── ProtocolParser.cs
│   └── Security/
│       └── AesEncryption.cs
└── Tests/
    └── NetworkTests.cs

参考代码 socket通讯(tcp/udp/文件传输等) www.youwenfan.com/contentcsh/57550.html

七、调试与测试建议

  1. 网络模拟工具

    • 使用WireShark抓包分析协议格式
    • 通过Clumsy模拟网络延迟/丢包
  2. 单元测试示例

    [TestClass]
    public class NetworkTests {
        [TestMethod]
        public async Task TestTcpTransfer() {
            var server = new TcpServer();
            var client = new TcpClient();
            
            await server.Start();
            await client.SendFile("test.dat");
            
            Assert.IsTrue(File.Exists("received_test.dat"));
        }
    }
    

到此这篇关于基于C#实现TCP/UDP通信及文件传输的示例的文章就介绍到这了,更多相关C# TCP/UDP通信内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#简单的特殊输出实例

    C#简单的特殊输出实例

    这篇文章主要介绍了C#简单的特殊输出,以实例实现了针对一些特殊字符与位置的输出控制,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-11-11
  • C# DateTime.ToString根据不同语言生成相应的时间格式

    C# DateTime.ToString根据不同语言生成相应的时间格式

    本文分享了一个按照不同国家的语言生成相应时间格式的案例,有需要做国外网站或者多国语言网站的朋友可以参考一下。
    2016-03-03
  • Unity ScrollView实现动态列表生成

    Unity ScrollView实现动态列表生成

    这篇文章主要为大家详细介绍了Unity ScrollView实现动态列表生成,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C#读取appsettings.json配置的常用方法

    C#读取appsettings.json配置的常用方法

    本文档介绍了在 C# 项目中读取 appsettings.json 文件的常用方法,涵盖了现代 .NET 的依赖注入(DI)模式以及适用于非 DI 环境的静态读取模式,并详细说明了不同数据类型的读取方式及常见踩坑点,需要的朋友可以参考下
    2026-03-03
  • C#代码实现将PDF转换为PDF线性化格式

    C#代码实现将PDF转换为PDF线性化格式

    PDF 线性化是一种对 PDF 文件进行优化的方式,本文将为大家详细介绍如何使用C#代码将普通 PDF 转换为线性化 PDF,感兴趣的小伙伴可以参考一下
    2026-04-04
  • C# 获取汉字的拼音首字母

    C# 获取汉字的拼音首字母

    一种是把所有中文字符集合起来组成一个对照表;另一种是依照汉字在Unicode编码表中的排序来确定拼音的首字母。碰到多音字时就以常用的为准(第一种方法中可以自行更改,方法为手动把该汉字移动到对应的拼音首字母队列,我们这里介绍第二种
    2015-06-06
  • C#实现简单的双色球抽取中奖号码代码

    C#实现简单的双色球抽取中奖号码代码

    这篇文章主要介绍了C#实现简单的双色球抽取中奖号码代码的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • C#中整理了几种字符串截取方法小结

    C#中整理了几种字符串截取方法小结

    本文给大家整理了几种字符串截取方法, (Substring);(Remove);(Replace)方法和split方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01
  • c# 如何实现代码生成器

    c# 如何实现代码生成器

    这篇文章主要介绍了c# 如何实现代码生成器,帮助大家更好的理解和使用c# 编程语言,感兴趣的朋友可以了解下
    2020-12-12
  • C#实现将批量图片转为PDF文件

    C#实现将批量图片转为PDF文件

    这篇文章主要为大家详细介绍了如何使用 iTextSharp 库实现,将指定目录下的有序的一组图片,组合生成指定文件名的PDF文件,有需要的可以了解下
    2024-10-10

最新评论