使用 TcpListener 实现 TCP 服务端,监听客户端连接并转发消息。
using System.Net;
using System.Net.Sockets;
using System.Text;
public class TcpChatServer
{
private TcpListener _listener;
private List _clients = new List();
private readonly object _lockObj = new object();
public async Task Start(int port)
{
_listener = new TcpListener(IPAddress.Any, port);
_listener.Start();
Console.WriteLine("服务器已启动,监听端口: " + port);
while (true)
{
var client = await _listener.AcceptTcpClientAsync();
lock (_lockObj) _clients.Add(client);
Console.WriteLine("新客户端连接");
_ = HandleClient(client);
}
}
private async Task HandleClient(TcpClient client)
{
NetworkStream stream = client.GetStream();
byte[] buffer = new byte[1024];
try
{
while (client.Connected)
{
int bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
if (bytesRead == 0) break;
string message = Encoding.UTF8.GetString(buffer, 0, bytesRead);
Console.WriteLine($"客户端: {message}");
// 广播消息给所有客户端
await BroadcastMessage(message, client);
}
}
catch (Exception ex)
{
Console.WriteLine($"客户端处理异常: {ex.Message}");
}
finally
{
lock (_lockObj) _clients.Remove(client);
client.Close();
}
}
private async Task BroadcastMessage(string message, TcpClient sender)
{
byte[] data = Encoding.UTF8.GetBytes(message);
lock (_lockObj)
{
foreach (var client in _clients)
{
if (client != sender && client.Connected)
{
await client.GetStream().WriteAsync(data, 0, data.Length);
}
}
}
}
// 调用示例
public static async Task TestServer()
{
var server = new TcpChatServer();
await server.Start(8888);
}
}