2012-01-10 61 views
2

我连接10个设备到LAN,个个有去像一个UDP服务器:如何编写将服务于来自不同客户端的并发请求的UDP服务器?

while(true){ 
    serverSocket.receive(receivePacket); 
    dostuff(receivePacket); 
} 
serverSocket.close(); 

现在让我们假设设备的9尝试simultaenously发起连接到第10装置。我怎样才能接受所有的9而不是只是第一个,然后将阻止套接字,直到服务器完成计算?我应该开始一个会照顾dostuf()的线程吗?这会让我从所有同时收到的请求中获得请求吗?

+0

检查这个环节的休息,请 http://stackoverflow.com/questions/773121/how-can-i-implement -a线程,基于UDP的服务器 - 在的Java – 2012-01-10 19:39:27

回答

3

一个基本的设计将负责处理传入请求(具有您想要的限制),然后将它们交给worker/request处理程序线程。当这些工作线程中的每一个完成时,您都需要更新共享/全局计数器,让主线程知道它可以建立新的连接。这需要一定程度的同步,但它可能非常有趣。

这里的想法:

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

您可以使用线程来解决这个问题。由于java已经有一个处理线程的API,所以你可以创建可运行的执行程序的实例,看看the Executor Interface。这里是另一个有用的链接,可能有帮助:blocking queue

1

使用相对较大的线程池,因为udp不需要响应。

主要方法将运行的监听器和线程池会做繁重