2012-09-28 54 views
1

我正在构建一个UDP服务器,它在单独的 线程中处理每个传入请求。问题是,UDP客户端可能通过使用多个线程同时发出多个请求 。客户端上的每个线程将等待 以获取来自服务器的响应。由于UDP是无连接的,因此客户端线程 可能会收到不匹配的数据报。在这种情况下,是否有任何 内置机制或模式来帮助客户端线程获得匹配的响应? (例如发送每个请求从服务器到特定的udp端口!!?) 我不想使用队列,因为它同时丢失属性。 如果不是,我想我们可以构建一个队列来分派适当的客户端线程的响应。但是,如果我需要在同一客户端计算机上的不同JVM中运行多个客户端 ,并且每个客户端将向同一服务器发出 请求,会发生什么情况?如何接收UDP并发请求?

+0

顺便说一句,队列概念在这里完全不合适。没有网络队列可以识别您要与哪个客户端进行通信。如果你的意思是消息队列,它们被用于同一台机器上的进程之间的IPC(进程间通信)。工作远程插座是一种方式。 – fayyazkl

回答

2

为每个udp客户端使用一个单独的套接字。这样你有一个不同的IP和端口发送,并会收到相同的响应,即发送请求的客户端只会收到它的响应(我认为这就是你的意思匹配)这应该会自动完成,除非你分享线程之间使用相同的套接字,并使用它将消息发送给服务器,这似乎是一个坏主意。

在将消息发送到服务器之前,可以在客户端中设置源(发送方端口)中的任何端口。服务器可以提取您的源端口并响应相同的端口,例如,

Client 1 source port:10401 -> server:listening port:2000. Server responds to port 10401. 

Client 2 source port:10402 -> server: listening port: 2000. Server responds to port 10402. 
+0

问题是,我发送多个请求从一个IP地址。我只能使用udp连接和udp端口是53,那么我不能使用多个端口从外面。例如我使用下载管理器下载和下载管理器同时使用10个单独的线程接收请求。我如何管理这个? – Moharrer

+0

你是说你不能使用53以外的任何端口来发送数据?通常在客户端,我们从来没有设置发件人端口,并且它是由我们自动选择的,即一些随机端口,如4543.这是一个不寻常的要求,即只有一个固定的客户端端口。还是你在谈论服务器端口? – fayyazkl

+0

我没有问题从服务器端。服务器发送我的回应从互联网上的其他电脑。我可以将请求从服务器发送到特定的客户端本地端口,例如127.0.0.1:9865。而我只能使用udp端口,那么我认为我只能使用端口53发送和接收我的请求。这是真的吗? – Moharrer

1

如果你想做并发连接,建立多个连接。在客户端产生一个新的UDP连接,服务器将在它的最后打开一个新的连接。在客户端上的连接1上发送的任何内容都会在服务器上的连接1上发送,在连接2上发送的任何内容都会在连接2上收到。

+0

我认为,因为udp是无连接协议和每个连接嗅探一个端口我不能使用此解决方案。 – Moharrer

+0

不正确,你仍然可以跟踪客户端的端口,这将是一个随机的高值数字。每个线程都与它自己的IP + Port组合对话。见[fayyazki的评论](http://stackoverflow.com/questions/12644417/how-to-receive-udp-concurrent-request/12644830#comment17055018_12644546) –

+0

你说我可以发送请求从服务器在其他国家的特定客户端本地端口?例如发送到127.0.0.1:6069 – Moharrer

相关问题