一、TCP服务器实现(支持多客户端)
csharp
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
public class TcpServer
{
private readonly TcpListener _listener;
private readonly int _port;
public TcpServer(int port)
{
_port = port;
_listener = new TcpListener(IPAddress.Any, port);
}
public async Task StartAsync()
{
_listener.Start();
Console.WriteLine($"服务器已启动,监听端口 {_port}");
while (true)
{
var client = await _listener.AcceptTcpClientAsync();
_ = HandleClientAsync(client); // 异步处理客户端连接
}
}
private async Task HandleClientAsync(TcpClient client)
{
try
{
Console.WriteLine($"客户端 {client.Client.RemoteEndPoint} 已连接");
using (client)
using (var stream = client.GetStream())
{
byte[] buffer = new byte[1024 * 4];
int bytesRead;
while ((bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length)) > 0)
{
string message = Encoding.UTF8.GetString(buffer, 0, bytesRead);
Console.WriteLine($"收到消息: {message}");
// 回显消息
await stream.WriteAsync(Encoding.UTF8.GetBytes($"ECHO: {message}"));
}
}
}
catch (Exception ex)
{
Console.WriteLine($"客户端 {client.Client.RemoteEndPoint} 异常: {ex.Message}");
}
}
}
二、TCP客户端实现
csharp
using System;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
public class TcpClientDemo
{
private readonly TcpClient _client;
private readonly NetworkStream _stream;
public TcpClientDemo(string serverIp, int port)
{
_client = new TcpClient();
_client.Connect(serverIp, port);
_stream = _client.GetStream();
}
public async Task SendAsync(string message)
{
try
{
byte[] data = Encoding.UTF8.GetBytes(message);
await _stream.WriteAsync(data, 0, data.Length);
Console.WriteLine($"已发送: {message}");
// 接收响应
byte[] buffer = new byte[1024 * 4];
int bytesRead = await _stream.ReadAsync(buffer, 0, buffer.Length);
string response = Encoding.UTF8.GetString(buffer, 0, bytesRead);
Console.WriteLine($"收到响应: {response}");
}
catch (Exception ex)
{
Console.WriteLine($"通信异常: {ex.Message}");
}
}
public void Disconnect()
{
_stream.Close();
_client.Close();
}
}
三、使用示例
服务器启动
csharp
var server = new TcpServer(8888);
await server.StartAsync();
客户端连接与通信
csharp
using var client = new TcpClientDemo("127.0.0.1", 8888);
await client.SendAsync("Hello Server!");
client.Disconnect();
四、关键特性实现
1. 异步通信优化
csharp
// 使用异步方法提升并发性能
public async Task HandleClientAsync(TcpClient client)
{
using (client)
using (var stream = client.GetStream())
{
byte[] buffer = new byte[1024 * 4];
while (true)
{
int bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
if (bytesRead == 0) break;
string message = Encoding.UTF8.GetString(buffer, 0, bytesRead);
await ProcessMessageAsync(client, message);
}
}
}
2. 异常处理机制
csharp
try
{
// 通信逻辑
}
catch (SocketException ex) when (ex.SocketErrorCode == SocketError.ConnectionReset)
{
Console.WriteLine("客户端异常断开连接");
}
catch (TimeoutException)
{
Console.WriteLine("操作超时,请检查网络状态");
}
3. 数据帧处理(带长度前缀)
csharp
// 发送带长度前缀的数据
byte[] message = Encoding.UTF8.GetBytes("Hello");
byte[] lengthPrefix = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(message.Length));
await stream.WriteAsync(lengthPrefix, 0, lengthPrefix.Length);
await stream.WriteAsync(message, 0, message.Length);
// 接收带长度前缀的数据
byte[] lengthBytes = new byte[4];
await stream.ReadExact(lengthBytes, 0, 4);
int length = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(lengthBytes, 0));
byte[] data = new byte[length];
await stream.ReadExact(data, 0, length);
参考代码 c#平台的TCPIP通讯客户端与服务器代码 www.youwenfan.com/contentcsr/112692.html
五、性能优化
-
缓冲区管理
csharp// 使用内存池减少GC压力 byte[] buffer = MemoryPool<byte>.Shared.Rent(1024 * 4); try { // 使用buffer进行读写操作 } finally { MemoryPool<byte>.Shared.Return(buffer); } -
连接池管理
csharp// 实现TCP连接池 public class TcpConnectionPool { private readonly ConcurrentBag<TcpClient> _pool = new(); public async Task<TcpClient> GetConnectionAsync(string ip, int port) { if (!_pool.TryTake(out var client)) { client = new TcpClient(); await client.ConnectAsync(ip, port); } return client; } } -
流量控制
csharp// 使用信号量限制并发连接数 private readonly SemaphoreSlim _semaphore = new(100); public async Task HandleClientAsync(TcpClient client) { await _semaphore.WaitAsync(); try { // 处理逻辑 } finally { _semaphore.Release(); } }
六、完整项目结构
bash
TcpCommunicationDemo/
├── Server/
│ ├── Program.cs // 服务器启动入口
│ └── TcpServer.cs // 服务器核心逻辑
├── Client/
│ ├── Program.cs // 客户端启动入口
│ └── TcpClientDemo.cs // 客户端实现
├── Models/
│ └── MessageProtocol.cs // 自定义通信协议
└── Tests/
└── ServerTests.cs // 单元测试
七、调试与监控
-
日志记录
csharpusing var logger = new FileLogger("server.log"); logger.Log($"[{DateTime.Now}] 新连接: {client.Client.RemoteEndPoint}"); -
性能监控
csharpvar perfCounter = new PerformanceCounter("Network Interface", "Bytes Received"); Console.WriteLine($"当前接收速率: {perfCounter.NextValue()} bytes/sec");
八、扩展功能实现
1. 心跳检测机制
csharp
// 客户端定时发送心跳包
private async Task SendHeartbeatAsync()
{
while (true)
{
await _stream.WriteAsync(Encoding.UTF8.GetBytes("HEARTBEAT"));
await Task.Delay(TimeSpan.FromSeconds(30));
}
}
2. 加密通信
csharp
// 使用TLS加密
var sslStream = new SslStream(_stream, false);
var sslClient = new SslClientAuthenticationOptions
{
TargetHost = "server.example.com",
EnabledSslProtocols = SslProtocols.Tls12
};
await sslStream.AuthenticateAsClientAsync(sslClient);