3

我正在开发 UDP 服务器/客户端应用程序。

我希望我的服务器一次能够处理 40 个客户端。我曾想过在服务器端创建 40 个线程,每个线程处理一个客户端。客户端是根据 IP 地址来区分的,每个唯一的 IP 地址都有一个线程。

每当客户端向服务器发送一些数据时,主线程都会提取客户端的 IP 地址并决定哪个线程将处理这个特定的客户端。有没有更好的方法来实现这个功能?

4

3 回答 3

3

可扩展的服务器应用程序有不同的方法,如果客户端数量不多,每个客户端一个线程似乎很好,完成此任务的另一种最有效的方法是使用线程池。当您有任何新任务将此任务分配给空闲工作线程时,这些线程将作为任务库工作。

于 2013-04-02T10:14:22.017 回答
2

看看这个项目,我觉得入手很有帮助:http: //www.codeproject.com/Articles/16935/A-Chat-Application-Using-Asynchronous-UDP-sockets

使用 IPAddress.Any,我们指定服务器应接受来自任何接口的客户端请求。要使用任何特定接口,我们可以使用 IPAddress.Parse (“192.168.1.1”) 代替 IPAddress.Any。然后 Bind 函数将 serverSocket 绑定到这个 IP 地址。epSender 识别数据来自的客户端。

使用 BeginReceiveFrom,我们开始接收将由客户端发送的数据。请注意,我们将 epSender 作为 BeginReceiveFrom 的最后一个参数传递,AsyncCallback OnReceive 通过 IAsyncResult 的 AsyncState 属性获取此对象,然后处理客户端请求(登录、注销和向用户发送消息)。了解 OnReceive 的实现请看附上的代码。

于 2013-03-28T12:48:53.223 回答
0

更好的方法是使用Proactor 模式(看看Boost.Asio library),而不是为每个客户端创建线程。使用这种方法,您的应用程序将具有更好的可扩展性和性能(尤其是在具有本机异步 i/o 的平台上)

此外,通过这种技术,线程将与并发分离,这意味着您不必将多线程及其所有复杂性弄得一团糟。

于 2013-04-30T12:32:32.950 回答