上一篇
C网络通信例程如何轻松实现高效数据传输?
- 行业动态
- 2025-05-14
- 1
C#网络通信例程演示了基于TCP协议实现客户端与服务器端的连接及数据传输,涵盖Socket编程、字节流解析和异步处理,通过TcpListener/TcpClient类建立通信管道,结合NetworkStream进行读写操作,并包含异常处理机制,适用于实时数据交换场景如即时通讯或物联网设备监控。
在C#中实现网络通信是开发分布式系统、实时应用程序或物联网解决方案的核心能力之一,以下将详细介绍基于TCP和UDP协议的C#网络通信实现方法,结合最佳实践与代码示例(兼容.NET Core及.NET Framework)。
TCP协议通信示例
TCP提供可靠的双向字节流通信,适用于需要确保数据完整性的场景。
TCP服务端实现
using System; using System.Net; using System.Net.Sockets; using System.Text; public class TcpServer { public static void Start(int port) { TcpListener listener = new TcpListener(IPAddress.Any, port); listener.Start(); Console.WriteLine($"Server started on port {port}"); while (true) { TcpClient client = listener.AcceptTcpClient(); Console.WriteLine($"Client connected: {client.Client.RemoteEndPoint}"); NetworkStream stream = client.GetStream(); byte[] buffer = new byte[1024]; int bytesRead = stream.Read(buffer, 0, buffer.Length); string receivedData = Encoding.UTF8.GetString(buffer, 0, bytesRead); Console.WriteLine($"Received: {receivedData}"); string response = "SERVER ACK: " + receivedData; byte[] responseData = Encoding.UTF8.GetBytes(response); stream.Write(responseData, 0, responseData.Length); client.Close(); } } }
TCP客户端实现
using System; using System.Net.Sockets; using System.Text; public class TcpClient { public static void Connect(string serverIP, int port) { using (System.Net.Sockets.TcpClient client = new System.Net.Sockets.TcpClient()) { client.Connect(serverIP, port); NetworkStream stream = client.GetStream(); string message = "Hello TCP Server"; byte[] data = Encoding.UTF8.GetBytes(message); stream.Write(data, 0, data.Length); Console.WriteLine($"Sent: {message}"); byte[] buffer = new byte[1024]; int bytesRead = stream.Read(buffer, 0, buffer.Length); string response = Encoding.UTF8.GetString(buffer, 0, bytesRead); Console.WriteLine($"Received: {response}"); } } }
UDP协议通信示例
UDP适用于对实时性要求高、允许少量数据丢失的场景(如视频流、游戏数据)。
UDP服务端
using System; using System.Net; using System.Net.Sockets; using System.Text; public class UdpServer { public static void Start(int port) { UdpClient udpServer = new UdpClient(port); IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0); Console.WriteLine($"UDP Server started on port {port}"); while (true) { byte[] receivedBytes = udpServer.Receive(ref remoteEP); string receivedData = Encoding.UTF8.GetString(receivedBytes); Console.WriteLine($"Received from {remoteEP}: {receivedData}"); string response = "SERVER RESPONSE"; byte[] responseBytes = Encoding.UTF8.GetBytes(response); udpServer.Send(responseBytes, responseBytes.Length, remoteEP); } } }
UDP客户端
using System; using System.Net; using System.Net.Sockets; using System.Text; public class UdpClient { public static void SendMessage(string serverIP, int port) { using (UdpClient client = new UdpClient()) { IPEndPoint ep = new IPEndPoint(IPAddress.Parse(serverIP), port); string message = "Hello UDP Server"; byte[] data = Encoding.UTF8.GetBytes(message); client.Send(data, data.Length, ep); Console.WriteLine($"Sent: {message}"); byte[] receivedBytes = client.Receive(ref ep); Console.WriteLine($"Received: {Encoding.UTF8.GetString(receivedBytes)}"); } } }
关键技术与注意事项
编码处理
使用Encoding.UTF8
进行字符串与字节流的转换,支持多语言字符// 编码 byte[] data = Encoding.UTF8.GetBytes("中文内容"); // 解码 string text = Encoding.UTF8.GetString(data);
异步通信
推荐使用async/await
模式提升并发处理能力:public async Task StartAsync() { TcpClient client = await listener.AcceptTcpClientAsync(); NetworkStream stream = client.GetStream(); byte[] buffer = new byte[1024]; int bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length); }
错误处理
必须包含异常捕获机制:try { // 网络操作代码 } catch (SocketException ex) { Console.WriteLine($"Socket error: {ex.SocketErrorCode}"); } catch (Exception ex) { Console.WriteLine($"General error: {ex.Message}"); }
常见问题解决
连接超时问题
设置TcpClient
的超时属性:client.SendTimeout = 5000; // 5秒 client.ReceiveTimeout = 5000;
大数据传输处理
使用分块传输协议:// 发送数据长度头 byte[] lengthHeader = BitConverter.GetBytes(data.Length); stream.Write(lengthHeader, 0, 4); // 分块发送数据
防火墙配置
确保服务器防火墙开放对应端口(控制面板→Windows Defender防火墙→高级设置)
性能优化建议
- 使用
SocketAsyncEventArgs
实现高性能Socket通信 - 采用连接池管理TCP长连接
- 对UDP数据包进行序列号校验
- 使用
MemoryPool<byte>
减少内存分配
引用说明
本文代码示例参考微软官方文档《.NET网络编程指南》,协议规范遵循RFC 793(TCP)与RFC 768(UDP),异步模式实现符合.NET Task-based Asynchronous Pattern (TAP)标准。