当前位置: 代码网 > it编程>编程语言>Asp.net > 基于C#实现TCP/UDP通信及文件传输的示例

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

2026年03月12日 Asp.net 我要评论
一、tcp通信实现1. 服务器端(文件传输)using system;using system.io;using system.net;using system.net.sockets;using s

一、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通信内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com