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.
Но есть много примеров в Интернете, которые описывают, как реализовать такой сервер.