java udp多线程服务器_在多线程UDP服务器中使用多个套接字

Requirement:

我需要编写一个能够接收多个客户端连接(FCFS命令)的服务器,并能够在一个单独的线程中处理每个客户端,这样处理就像所有客户端同时提供一样 . 使用的传输协议应该是UDP . 此外,在客户端和服务器之间也会发生几次数据传输,并且从客户端接收的数据必须存储在服务器端,以便进一步处理该客户端 .

Implementation:

为此,我采用了队列/线程池机制 . 最初,我创建了一个固定数量的线程池,并有一个队列数据结构来存储客户端地址 . 此队列在所有线程之间共享,因此我使用“mutex”来锁定/解锁此队列 . 在主服务器线程中,我创建一个套接字,将其绑定到全局端口/地址,然后在“recvfrom”调用时阻止服务器 . 任何想要与服务器通信的客户端都会向监听全局端口地址的主线程服务器发送“Hi”消息 . 接收到这个“Hi”数据报后,主服务器线程将客户端的sockaddr结构推送到队列上,然后返回阻止“recvfrom”调用以接受其他客户端 .

任何获取队列锁定的池线程,弹出客户端的地址并开始自行处理该客户端 . 也就是说,池线程现在将创建一个套接字,将其绑定到与全局端口不同的端口,并使用弹出的客户端地址将此端口地址发送到客户端 . 在客户端,在发送“Hi”消息后,它会阻止“recvfrom”呼叫,一旦它从服务器(具有不同的端口)收到消息,它就会存储此端口/地址,然后它会与之通信服务器仅使用池服务器线程发送的新端口 .

Clarification needed:

我注意到在许多Stack溢出问题中,单个SOCKET在多线程UDP服务器中总是足够的,但根据我的要求,我认为我需要多个UDP套接字,每个套接字都适用于客户端 . 请根据我的要求向我提供有关线程UDP服务器方法的建议

EDIT: Improved the design

感谢您对我的设计的所有评论和讨论 . 在掌握了关于单插槽连接和上下文切换的所有观点之后,我考虑了改进的设计 . 请提供有关我改进设计的反馈

在此实现中,我将仅使用绑定到全局已知端口地址的一个全局UDP套接字 . 就像以前一样,我最初会创建一个固定数量的线程,比如5个线程 . 然后我在所有线程中的单个套接字上执行recvfrom() . 无论哪个线程首先接收数据报,都能够从这个数据报中知道三件事:

客户端sockaddr(客户端地址)

客户数据(发送的实际数据)

进程号(与数据一起发送 . 这是为了让服务器知道必须对客户端数据进行哪种处理)

根据上述信息,服务器线程将根据进程号处理数据,并将回复发送到收到它的同一客户端 . 在处理数据并发送回复(如果需要)之后,该线程将返回到recvfrom()调用的阻塞 .

此外,有关各种客户端的详细信息将存储在全局哈希表和映射中(可供所有线程访问),以便任何线程都可以访问它以根据该特定客户端进行处理 .

Changes at the client side: 服务器应该能够知道它必须对客户端数据进行哪些处理 . 因此,客户端将发送进程号和数据 .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值