c# socket服务器 封装类 多线程
时间: 2023-08-07 15:05:51 浏览: 54
以下是一个支持多线程的C# Socket服务器封装类的示例:
```csharp
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
public class SocketServer
{
private readonly List<Socket> _clients = new List<Socket>();
private readonly Socket _listener;
private readonly Thread _listenerThread;
public SocketServer(int port)
{
_listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_listener.Bind(new IPEndPoint(IPAddress.Any, port));
_listener.Listen(10);
_listenerThread = new Thread(ListenForClients);
_listenerThread.Start();
Console.WriteLine($"Server started on port {port}");
}
private void ListenForClients()
{
while (true)
{
var client = _listener.Accept();
_clients.Add(client);
Console.WriteLine($"Client connected: {client.RemoteEndPoint}");
var thread = new Thread(HandleClient);
thread.Start(client);
}
}
private void HandleClient(object clientObj)
{
var client = (Socket)clientObj;
var buffer = new byte[1024];
while (true)
{
try
{
var bytesRead = client.Receive(buffer);
if (bytesRead > 0)
{
var message = Encoding.ASCII.GetString(buffer, 0, bytesRead);
Console.WriteLine($"Received message from {client.RemoteEndPoint}: {message}");
// Echo the message back to the client
var responseBuffer = Encoding.ASCII.GetBytes(message);
client.Send(responseBuffer);
}
else
{
Console.WriteLine($"Client disconnected: {client.RemoteEndPoint}");
_clients.Remove(client);
client.Close();
return;
}
}
catch (SocketException)
{
Console.WriteLine($"Client disconnected: {client.RemoteEndPoint}");
_clients.Remove(client);
client.Close();
return;
}
}
}
public void Close()
{
_listener.Close();
foreach (var client in _clients)
{
client.Shutdown(SocketShutdown.Both);
client.Close();
}
}
}
```
使用示例:
```csharp
var server = new SocketServer(1234);
Console.ReadLine();
server.Close();
```
这个封装类与之前的封装类非常相似,但它在接受客户端连接时创建了一个新的线程来处理每个客户端。这允许服务器同时处理多个客户端,而不必等待一个客户端的操作完成后才能处理另一个客户端。当客户端断开连接时,对应的线程也会退出。可以通过调用Close()方法来关闭服务器。