异步 TCP
异步服务端
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
class AsyncTcpServer
{
static async Task Main(string[] args)
{
TcpListener server = new TcpListener(IPAddress.Parse("127.0.0.1"), 8888);
server.Start();
Console.WriteLine("异步服务端已启动");
// 异步等待连接
TcpClient client = await server.AcceptTcpClientAsync();
Console.WriteLine("客户端已连接");
NetworkStream stream = client.GetStream();
byte[] buffer = new byte[1024];
while (true)
{
try
{
// 异步读取
int len = await stream.ReadAsync(buffer, 0, buffer.Length);
string msg = Encoding.UTF8.GetString(buffer, 0, len);
Console.WriteLine("客户端:" + msg);
// 异步回复
byte[] resBytes = Encoding.UTF8.GetBytes("服务端收到:" + msg);
await stream.WriteAsync(resBytes, 0, resBytes.Length);
}
catch
{
Console.WriteLine("客户端断开");
break;
}
}
}
}
————————————————————————————————————————————————————————————————————————————————————————
异步客户端
using System;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
class AsyncTcpClient
{
static async Task Main(string[] args)
{
TcpClient client = new TcpClient();
await client.ConnectAsync("127.0.0.1", 8888);
NetworkStream stream = client.GetStream();
Console.WriteLine("已连接服务端");
while (true)
{
Console.Write("输入消息:");
string msg = Console.ReadLine();
byte[] bytes = Encoding.UTF8.GetBytes(msg);
await stream.WriteAsync(bytes, 0, bytes.Length);
byte[] buffer = new byte[1024];
int len = await stream.ReadAsync(buffer, 0, buffer.Length);
string res = Encoding.UTF8.GetString(buffer, 0, len);
Console.WriteLine(res);
}
}
}
——————————————————————————————————————————————————————————————————————————————————————
TCP 传输的是 byte [] 字节数组,不是字符串。所以必须:・发送:字符串 → 转字节・接收:字节 → 转字符串
编码统一用 UTF8。
2. 粘包 / 半包问题(非常重要)
TCP 是流协议,数据会粘在一起。例如:你发 "A"、"B"对方可能一次收到 "AB"
解决方案:・固定长度・加分隔符(如 \n)・消息头 + 消息体(最标准)
3. 异常处理
客户端断开、网络中断都会抛出异常,必须用 try-catch。
4. 端口占用
・端口只能被一个程序占用・客户端和服务端端口必须一致

浙公网安备 33010602011771号