Как я могу использовать пул потоков для обработки каждого соединения в новом потоке - PullRequest
2 голосов
/ 12 ноября 2009

У меня есть простой сервер, который ждет подключения клиента, читает входящий поток и отправляет сообщение обратно. Я хотел бы, чтобы каждое соединение обрабатывалось отдельным потоком. Я впервые работаю с сокетами и потоками в C #, и большинство примеров, которые я нашел, действительно сбивают с толку, поэтому любая помощь или простые примеры будут высоко оценены.

Вот то, что у меня сейчас есть.

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;

    [STAThread]
    static void Main(string[] args)
    {
        TestServer ts = new TestServer();
         ts.Start();
    }

class TestServer
{
    private readonly int port = 48888;
    private readonly IPAddress ip = IPAddress.Parse("127.0.0.1");

    private TcpListener listener;

    public TestServer()
    {
       this.listener = new TcpListener(this.ip, this.port);
    }

    public void Start()
    {
        this.listener.Start();
        Console.WriteLine("Server Running...");

        Socket s;
        Byte[] incomingBuffer;
        int bytesRead;
        Byte[] Message;

        while (true)
        {
            s = this.listener.AcceptSocket();

            incomingBuffer = new Byte[100];
            bytesRead = s.Receive(incomingBuffer);
            string message = "Hello from the server";
            Message = Encoding.ASCII.GetBytes(message.ToCharArray());

            s.Send(Message);
        }
    }
}

Ответы [ 3 ]

4 голосов
/ 12 ноября 2009

Попробуйте это:

public void Start()
{
    this.listener.Start();
    Console.WriteLine("Server running...");

    while (true)
    {
        Socket s = this.listener.AcceptSocket();
        ThreadPool.QueueUserWorkItem(this.WorkMethod, s);
    }
}

private void WorkMethod(object state)
{
    using (Socket s = (Socket)state)
    {
        byte[] buffer = new byte[100];
        int count = s.Receive(buffer);
        string message = "Hello from the server";
        byte[] response = Encoding.ASCII.GetBytes(message);
        s.Send(response);
    }
}
1 голос
/ 12 ноября 2009

Не отвечаю на ваш вопрос напрямую, но ...

Пулы потоков - не о «новом потоке на соединение», а о том, чтобы какое-то значимое количество потоков (с некоторым отношением к количеству ядер на коробке) уже работало и ожидало работы. Эта «работа» передается в пул производственным потоком (принимающим подключения в вашем случае) через одну или несколько очередей.

Обратите внимание, что это не всегда лучшее решение. Взгляните на C10K и Высокопроизводительная архитектура сервера страниц.

0 голосов
/ 12 ноября 2009

Используйте пул потоков. Вы можете использовать инстанцирование потоков вручную, но поскольку у вас может быть огромное количество соединений, threadpoool более эффективен.

System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(processMessage), socket);

processMessage - метод, который обработает сообщение. И будет один поток на соединение. Действительно просто на самом деле.

...