C# 用于同时处理多个客户端请求的套接字服务器

C# 用于同时处理多个客户端请求的套接字服务器,c#,sockets,unity3d,asyncsocket,C#,Sockets,Unity3d,Asyncsocket,我想使用套接字服务器并发处理多个客户端的请求。 我有10个客户端,它们可以同时向我的服务器发送请求。 我该怎么办? 可能吗 使用下面的代码,我一次只能处理一个请求,请求完成后,服务器接受下一个请求。 由于这个原因,第10个客户端需要等待9个请求完成 任何帮助都将不胜感激 下面是我用于服务器套接字的代码 Socket _serverSocket; byte[] _buffer = new byte[255]; void SetupServer() { try {

我想使用套接字服务器并发处理多个客户端的请求。 我有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);
}

您应该熟悉“多线程服务器”的概念。您应该为每个连接到服务器的客户端启动一个线程。因此,您可以同时处理多个客户端。如果您想尝试更新的.NET功能,也可以使用
任务并行库


但是网络上有很多例子描述了如何实现这样一个服务器。

实际上,在处理完之前的
beginacept()
之后,您包含的代码会立即调用
beginacept()
,因此应该能够处理多个连接而不会出现任何问题。如果您不同意该评估,请发布一个好的、完整的、简明的代码示例,演示您的意思。你好,彼得,谢谢你的快速回复。我,AcceptCallback,我如何区分多个客户端套接字。GetHashCode()是我要找的。但是msdn说它不能保证给你唯一的id。我能够接收并发请求,但是如果他们发送另一个请求,就无法维护客户端的身份。客户端的“身份”是它的IP+端口。如果没有其他内容,您可以使用它来区分不同的客户机。接受的
Socket
实例本身也是一个标识;i、 例如,当您在
套接字
实例上调用
BeginReceive()
时,该接收操作将仅针对该
套接字
实例以及您在调用中提供的任何用户提供的状态对象值完成。通常,服务器有一个“用户状态”对象,其中包含每个客户机的特定信息。在简单的echo服务器示例中,您只需在刚刚完成操作的同一个
套接字上进行回复。嗨,Thomas,感谢您的快速回复。据我所知,使用多线程并不是有效的方法,相反异步套接字是更有效的方法。老实说,我是一个socket编程新手,所以对此并不确定。