上一篇
C网络编程如何轻松实现高效通信?
- 行业动态
- 2025-05-11
- 4
C#网络编程可通过Socket类实现客户端-服务器通信,支持TCP/UDP协议,示例使用TcpListener监听请求,TcpClient建立连接,通过NetworkStream传输数据,异步方法和多线程处理可提升并发性能,适用于实时聊天、文件传输等场景。
在C#中实现网络编程的核心场景包括客户端-服务器通信、数据传输协议处理以及异步任务调度,以下通过具体案例演示如何构建基础的TCP和UDP应用,并解释关键代码逻辑。
TCP协议实现聊天服务器
场景说明:创建一个支持多客户端连接的聊天室,实时转发消息。
// 服务器端 using System.Net; using System.Net.Sockets; using System.Text; TcpListener server = new TcpListener(IPAddress.Any, 8888); server.Start(); Console.WriteLine("服务器已启动,等待连接..."); List<TcpClient> clients = new List<TcpClient>(); while (true) { TcpClient client = server.AcceptTcpClient(); clients.Add(client); Task.Run(() => HandleClient(client)); } async void HandleClient(TcpClient client) { NetworkStream stream = client.GetStream(); byte[] buffer = new byte[1024]; while (true) { int bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length); string message = Encoding.UTF8.GetString(buffer, 0, bytesRead); Console.WriteLine($"收到消息:{message}"); // 广播给所有客户端 foreach (var c in clients.Where(c => c != client)) { byte[] data = Encoding.UTF8.GetBytes(message); await c.GetStream().WriteAsync(data, 0, data.Length); } } }
// 客户端 TcpClient client = new TcpClient(); client.Connect("127.0.0.1", 8888); NetworkStream stream = client.GetStream(); // 接收消息线程 Task.Run(() => { byte[] buffer = new byte[1024]; while (true) { int bytesRead = stream.Read(buffer, 0, buffer.Length); string message = Encoding.UTF8.GetString(buffer, 0, bytesRead); Console.WriteLine($"[其他用户]:{message}"); } }); // 发送消息 while (true) { string input = Console.ReadLine(); byte[] data = Encoding.UTF8.GetBytes(input); stream.Write(data, 0, data.Length); }
UDP协议实现文件传输
场景说明:通过无连接协议发送文件片段,适合对可靠性要求不高的场景。
// 发送端 UdpClient sender = new UdpClient(); FileStream fileStream = File.OpenRead("demo.zip"); byte[] chunk = new byte[8192]; while (fileStream.Read(chunk, 0, chunk.Length) > 0) { sender.Send(chunk, chunk.Length, "127.0.0.1", 9999); Array.Clear(chunk, 0, chunk.Length); } sender.Close();
// 接收端 UdpClient receiver = new UdpClient(9999); IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0); FileStream fileStream = File.Create("received.zip"); while (true) { byte[] data = receiver.Receive(ref remoteEP); fileStream.Write(data, 0, data.Length); if (data.Length < 8192) break; // 简单结束判断 } fileStream.Close();
关键技术与优化策略
异步处理
使用async/await
避免线程阻塞,提升并发能力:async Task ProcessRequestAsync(Socket socket) { byte[] buffer = new byte[1024]; int received = await socket.ReceiveAsync(buffer, SocketFlags.None); // 处理数据... }
协议封装
自定义数据包头包含元信息:public class PacketHeader { public int PacketSize { get; set; } public int Checksum { get; set; } public DateTime Timestamp { get; set; } }
异常监控
网络通信必须包含错误处理:try { client.Connect(ipEndPoint); } catch (SocketException ex) { Console.WriteLine($"连接失败:{ex.SocketErrorCode}"); }
安全注意事项
- 输入验证:过滤
byte[]
数据中的非规字符 - 流量控制:限制最大连接数防止DDoS攻击
- 加密传输:使用TLS/SSL包装网络流
SslStream sslStream = new SslStream(networkStream); sslStream.AuthenticateAsServer(serverCertificate);
典型应用场景
- 物联网设备监控
TCP长连接维持设备状态同步 - 实时游戏服务器
UDP协议降低延迟,配合可靠性层 - 分布式计算节点
多线程处理工作节点间的数据交换
引用说明
- Microsoft官方文档《TcpListener Class》
https://learn.microsoft.com/en-us/dotnet/api/system.net.sockets.tcplistener - RFC 768 – User Datagram Protocol
https://tools.ietf.org/html/rfc768 - 《Network Programming in .NET》ISBN 978-1-4302-5847-4
结束)