c# socket编程怎样实现多线程

avatar
作者
筋斗云
阅读量:0

在C#中,使用Socket编程实现多线程主要涉及到两个方面:服务器端的多线程处理客户端连接,以及客户端的多线程处理数据收发。下面分别介绍这两个方面。

  1. 服务器端多线程处理客户端连接:

服务器端需要创建一个线程池来处理客户端的连接请求。当有新的客户端连接时,从线程池中取出一个线程来处理该客户端的请求。这样可以避免为每个客户端连接创建一个新的线程,从而提高服务器的性能。

以下是一个简单的服务器端多线程处理客户端连接的示例:

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.");     } } 
  1. 客户端多线程处理数据收发:

客户端可以使用多线程来同时处理多个数据收发任务。例如,可以创建一个线程用于接收服务器发送的数据,另一个线程用于向服务器发送数据。

以下是一个简单的客户端多线程处理数据收发的示例:

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);              // 处理接收到的数据...         }     } } 

这个示例中,服务器端使用线程池处理客户端连接,客户端使用一个线程接收服务器数据。你可以根据需要调整线程的数量和处理逻辑。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!