我正在将10个设备连接到LAN,它们都有一个udp服务器,如:
while(true){
serverSocket.receive(receivePacket);
dostuff(receivePacket);
}
serverSocket.close();
现在让我们假设其中9个设备尝试同时启动与第10个设备的连接。我怎样才能接受所有9而不是第一个然后阻塞套接字直到服务器完成计算?我应该开始一个负责dostuf()的线程吗?这会让我收到所有同时请求的请求吗?
答案 0 :(得分:3)
基本设计将在线程上负责处理传入的请求(具有您所需的限制),然后将它们交给工作者/请求处理程序线程。当每个工作线程完成时,您需要更新共享/全局计数器,让主线程知道它可以建立新连接。这需要一定程度的同步,但它可以非常有趣。
以下是这个想法:
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()
您需要确保同步完全正确,这只是为了让您了解可以开始使用的内容。但是当你掌握它时,你将能够进行优化和增强。一个特殊的增强功能,也适用于有限数量的请求,称为ThreadPool。
无论基本结构与大多数服务器非常相似:负责将请求移交给工作线程的主线程。这是一个简洁而简单的抽象。
答案 1 :(得分:1)
您可以使用线程来解决该问题。由于java已经有一个处理线程的API,你可以创建runnable executors的实例,看看the Executor Interface。这是另一个可能有用的有用链接:blocking queue
答案 2 :(得分:1)
使用相对较大的线程池,因为udp不需要响应。
main方法将作为监听器运行,而线程池将执行其余的繁重工作