在C#中,使用Socket编程实现多线程主要涉及到两个方面:服务器端的多线程处理客户端连接,以及客户端的多线程处理数据收发。下面分别介绍这两个方面。
- 服务器端多线程处理客户端连接:
服务器端需要创建一个线程池来处理客户端的连接请求。当有新的客户端连接时,从线程池中取出一个线程来处理该客户端的请求。这样可以避免为每个客户端连接创建一个新的线程,从而提高服务器的性能。
以下是一个简单的服务器端多线程处理客户端连接的示例:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Collections.Generic;
class Server
{
static void Main(string[] args)
{
int port = 12345;
TcpListener server = new TcpListener(IPAddress.Any, port);
server.Start();
Console.WriteLine("Server started...");
while (true)
{
TcpClient client = server.AcceptTcpClient();
Console.WriteLine("New client connected.");
// 将客户端连接任务添加到线程池
ThreadPool.QueueUserWorkItem(HandleClient, client);
}
}
static void HandleClient(object state)
{
TcpClient client = (TcpClient)state;
NetworkStream stream = client.GetStream();
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) != 0)
{
string data = https://www.yisu.com/ask/Encoding.ASCII.GetString(buffer, 0, bytesRead);"Received from client: " + data);
// 处理客户端数据...
string response = "Server response";
byte[] responseBytes = Encoding.ASCII.GetBytes(response);
stream.Write(responseBytes, 0, responseBytes.Length);
}
client.Close();
Console.WriteLine("Client disconnected.");
}
}
- 客户端多线程处理数据收发:
客户端可以使用多线程来同时处理多个数据收发任务。例如,可以创建一个线程用于接收服务器发送的数据,另一个线程用于向服务器发送数据。
以下是一个简单的客户端多线程处理数据收发的示例:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
class Client
{
static void Main(string[] args)
{
string serverAddress = "127.0.0.1";
int port = 12345;
TcpClient client = new TcpClient(serverAddress, port);
NetworkStream stream = client.GetStream();
// 启动一个线程用于接收服务器数据
Thread receiveThread = new Thread(ReceiveData);
receiveThread.Start();
// 发送数据到服务器...
Console.WriteLine("Client disconnected.");
}
static void ReceiveData()
{
byte[] buffer = new byte[1024];
int bytesRead;
while (true)
{
bytesRead = stream.Read(buffer, 0, buffer.Length);
if (bytesRead == 0)
break;
string data = https://www.yisu.com/ask/Encoding.ASCII.GetString(buffer, 0, bytesRead);"Received from server: " + data);
// 处理接收到的数据...
}
}
}
这个示例中,服务器端使用线程池处理客户端连接,客户端使用一个线程接收服务器数据。你可以根据需要调整线程的数量和处理逻辑。