Java 如何编写一个UDP服务器,为来自不同客户端的n个并发请求提供服务?
我将10台设备连接到一个LAN,它们都有一个udp服务器,如下所示:Java 如何编写一个UDP服务器,为来自不同客户端的n个并发请求提供服务?,java,multithreading,concurrency,udp,client-server,Java,Multithreading,Concurrency,Udp,Client Server,我将10台设备连接到一个LAN,它们都有一个udp服务器,如下所示: while(true){ serverSocket.receive(receivePacket); dostuff(receivePacket); } serverSocket.close(); 现在让我们假设其中9个设备同时尝试启动与第10个设备的连接。我怎样才能接受全部9,而不仅仅是第一个,这将阻止套接字,直到服务器完成计算?我应该启动一个线程来处理dostuf吗?这会让我从所有同时收到的请求中得到请求吗?一
while(true){
serverSocket.receive(receivePacket);
dostuff(receivePacket);
}
serverSocket.close();
现在让我们假设其中9个设备同时尝试启动与第10个设备的连接。我怎样才能接受全部9,而不仅仅是第一个,这将阻止套接字,直到服务器完成计算?我应该启动一个线程来处理dostuf吗?这会让我从所有同时收到的请求中得到请求吗?一个基本的设计将在线程上负责处理具有所需限制的传入请求,然后将它们传递给工作线程/请求处理线程。当这些工作线程中的每一个都完成时,您需要更新一个共享/全局计数器,以让主线程知道它可以建立新的连接。这将需要一定程度的同步,但它可能非常有趣 我的想法是:
serverThread:
while true:
serverLock.acquire()
if numberOfRequests < MAX_REQUESTS:
packet = socket.receive()
numberOfRequests++
requestThread(packet).run()
else
serverMonitor.wait(serverLock);
serverLock.release()
requestThread:
//handle packet
serverLock.acquire()
if numberOfRequests == MAX_REQUESTS:
numberOfRequests--
serverMonitor.pulse();
serverLock.release()
您需要确保同步是正确的,这只是为了让您了解可以从什么开始。但是当你掌握了窍门,你就可以进行优化和增强。一种特殊的增强功能,也适用于有限数量的请求,称为
无论如何,基本结构与大多数服务器非常相同:一个主线程负责将请求传递给工作线程。这是一个简洁的抽象。您可以使用线程来解决这个问题。由于java已经有了一个处理线程的API,您只需创建可运行执行器的实例,请看一看。下面是另一个可能有帮助的有用链接:使用相对较大的线程池,因为udp不需要响应 main方法将作为侦听器运行,线程池将完成其余的繁重工作请检查此链接