Socket Server для одновременной обработки нескольких запросов клиентов

Я хочу обрабатывать запросы нескольких клиентов одновременно, используя Socket Server. У меня есть 10 клиентов, которые могут отправить запрос на мой сервер одновременно. Как я мог справиться с этим? Является ли это возможным?

С кодом ниже, я могу обрабатывать только один запрос за раз, после завершения запроса сервер принимает следующий запрос. В связи с этим 10-й клиент должен дождаться завершения 9 запросов.

Любая помощь будет оценена

Ниже приведен код, который я использую для сокета сервера

Socket _serverSocket;
byte[] _buffer = new byte[255];

void SetupServer()
{
    try 
    {
        Console.WriteLine ("Setting up server...");

        IPEndPoint ipEndPoint = new IPEndPoint (IPAddress.Parse(_ip), _port);

        // create server socket to listen new client's connection
        _serverSocket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        _serverSocket.Bind (ipEndPoint);
        _serverSocket.Listen (100);

        _serverSocket.BeginAccept (new AsyncCallback (AcceptCallback), null);
    } 
    catch (System.Exception ex) 
    {
        Console.WriteLine ("Server failed :: {0}", ex.Message);
    }
}

void AcceptCallback(IAsyncResult ar)
{
    Socket clientSocket = _serverSocket.EndAccept(ar);

    _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);

    clientSocket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(RecieveCallback), clientSocket);
}

void RecieveCallback(IAsyncResult ar)
{
    Socket clientSocket = (Socket)ar.AsyncState;

    int received = clientSocket.EndReceive(ar);

    // check if client is disconnected?
    if (received == 0)
    {
        Console.WriteLine("client is disconnected...");

        return;
    }

    // do whatever you want with received data here...
    byte[] dataBuf = new byte[received];

    Array.Copy(_buffer, dataBuf, received);

    string text = Encoding.ASCII.GetString(dataBuf);

    Console.WriteLine("Received Data: {0}", text);

    // accept new request
    clientSocket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(RecieveCallback), clientSocket);
}

1 ответ

Вам следует ознакомиться с концепцией "многопоточного сервера". Вы должны запустить поток для каждого клиента, который подключается к серверу. Таким образом, вы можете одновременно обрабатывать несколько клиентов. Или вы могли бы использовать Tasks Parallel Library если вы хотите попробовать новые функции.NET.

Но есть много примеров в Интернете, которые описывают, как реализовать такой сервер.

Другие вопросы по тегам