阅读量:0
在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); // 处理接收到的数据... } } }
这个示例中,服务器端使用线程池处理客户端连接,客户端使用一个线程接收服务器数据。你可以根据需要调整线程的数量和处理逻辑。