一、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);
}
}
}
}
}
四、协议对比与选型建议
| 特性 | tcp | udp |
|---|---|---|
| 连接方式 | 面向连接 | 无连接 |
| 可靠性 | 保证送达、顺序、完整性 | 不保证 |
| 传输效率 | 较低(有握手和确认机制) | 高(无额外开销) |
| 适用场景 | 文件传输、web服务 | 实时音视频、在线游戏、dns查询 |
| 典型实现类 | tcplistener/tcpclient | udpclient |
五、安全增强措施
ssl/tls加密
using (sslstream sslstream = new sslstream(stream, false)) { sslstream.authenticateasserver(servercertificate); await sslstream.writeasync(encrypteddata); }数据校验
// 添加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
七、调试与测试建议
网络模拟工具
- 使用
wireshark抓包分析协议格式 - 通过
clumsy模拟网络延迟/丢包
- 使用
单元测试示例
[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通信内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论