在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 = Encoding.ASCII.GetString(buffer, 0, bytesRead);
Console.WriteLine("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 = Encoding.ASCII.GetString(buffer, 0, bytesRead);
Console.WriteLine("Received from server: " + data);
// 處理接收到的數據...
}
}
}
這個示例中,服務器端使用線程池處理客戶端連接,客戶端使用一個線程接收服務器數據。你可以根據需要調整線程的數量和處理邏輯。