如何编写将为来自不同客户端的n个并发请求提供服务的UDP服务器?

时间:2012-01-10 19:20:12

标签: java multithreading concurrency udp client-server

我正在将10个设备连接到LAN,它们都有一个udp服务器,如:

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

现在让我们假设其中9个设备尝试同时启动与第10个设备的连接。我怎样才能接受所有9而不是第一个然后阻塞套接字直到服务器完成计算?我应该开始一个负责dostuf()的线程吗?这会让我收到所有同时请求的请求吗?

3 个答案:

答案 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方法将作为监听器运行,而线程池将执行其余的繁重工作