c# socket編程怎樣實(shí)現(xiàn)多線程

c#
小樊
83
2024-10-09 04:41:29

在C#中,使用Socket編程實(shí)現(xiàn)多線程主要涉及到兩個(gè)方面:服務(wù)器端的多線程處理客戶端連接,以及客戶端的多線程處理數(shù)據(jù)收發(fā)。下面分別介紹這兩個(gè)方面。

  1. 服務(wù)器端多線程處理客戶端連接:

服務(wù)器端需要?jiǎng)?chuàng)建一個(gè)線程池來(lái)處理客戶端的連接請(qǐng)求。當(dāng)有新的客戶端連接時(shí),從線程池中取出一個(gè)線程來(lái)處理該客戶端的請(qǐng)求。這樣可以避免為每個(gè)客戶端連接創(chuàng)建一個(gè)新的線程,從而提高服務(wù)器的性能。

以下是一個(gè)簡(jiǎn)單的服務(wù)器端多線程處理客戶端連接的示例:

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.");

            // 將客戶端連接任務(wù)添加到線程池
            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);

            // 處理客戶端數(shù)據(jù)...

            string response = "Server response";
            byte[] responseBytes = Encoding.ASCII.GetBytes(response);
            stream.Write(responseBytes, 0, responseBytes.Length);
        }

        client.Close();
        Console.WriteLine("Client disconnected.");
    }
}
  1. 客戶端多線程處理數(shù)據(jù)收發(fā):

客戶端可以使用多線程來(lái)同時(shí)處理多個(gè)數(shù)據(jù)收發(fā)任務(wù)。例如,可以創(chuàng)建一個(gè)線程用于接收服務(wù)器發(fā)送的數(shù)據(jù),另一個(gè)線程用于向服務(wù)器發(fā)送數(shù)據(jù)。

以下是一個(gè)簡(jiǎn)單的客戶端多線程處理數(shù)據(jù)收發(fā)的示例:

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();

        // 啟動(dòng)一個(gè)線程用于接收服務(wù)器數(shù)據(jù)
        Thread receiveThread = new Thread(ReceiveData);
        receiveThread.Start();

        // 發(fā)送數(shù)據(jù)到服務(wù)器...

        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);

            // 處理接收到的數(shù)據(jù)...
        }
    }
}

這個(gè)示例中,服務(wù)器端使用線程池處理客戶端連接,客戶端使用一個(gè)線程接收服務(wù)器數(shù)據(jù)。你可以根據(jù)需要調(diào)整線程的數(shù)量和處理邏輯。

0