我正在开发一个UDP服务器/客户端应用程序。
我希望我的服务器能够同时处理40个客户端。我考虑在服务器端创建40个线程,每个线程处理一个客户端。客户端根据IP地址区分,并且每个唯一的IP地址都有一个线程。
当客户端向服务器发送数据时,主线程提取客户端的IP地址并决定哪个线程将处理该特定客户端。是否有更好的方法来实现此功能?
我正在开发一个UDP服务器/客户端应用程序。
我希望我的服务器能够同时处理40个客户端。我考虑在服务器端创建40个线程,每个线程处理一个客户端。客户端根据IP地址区分,并且每个唯一的IP地址都有一个线程。
当客户端向服务器发送数据时,主线程提取客户端的IP地址并决定哪个线程将处理该特定客户端。是否有更好的方法来实现此功能?
扩展服务器应用程序有不同的方法,如果客户端数量不多,则每个客户端一个线程似乎是不错的选择,但另一种更有效的方法是使用线程池。这些线程作为任务基础工作,每当您有任何新任务时,将此任务分配给空闲的工作线程。
看一下这个项目,我认为它对于初学者非常有帮助: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 的实现。
send
向客户端发送数据,而是使用sendto
。网络堆栈将能够处理它。您只需要小心,不要让多个线程同时调用sendto
,可以通过让单个线程执行所有通信或使用互斥锁等方式来保护发送过程。 - Some programmer dude