【问题标题】:How to Receive UDP Concurrent Request?如何接收 UDP 并发请求?
【发布时间】:2012-09-28 17:07:44
【问题描述】:

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

【问题讨论】:

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

标签: c# java c sockets udp


【解决方案1】:

为每个 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.

【讨论】:

  • 问题是我从一个 IP 地址发送多个请求。我只能使用 udp 连接,而 udp 端口​​是 53,然后我不能从外部使用多个端口。例如,我使用下载管理器下载和下载管理器使用 10 个单独的线程同时接收请求。我该如何管理?
  • 你是说你不能使用53以外的任何端口进行发送?通常在客户端中,我们从不设置发送端口,它是由堆栈自动为我们选择的,即一些随机端口,如 4543。这是一个不寻常的要求,即只有一个固定的客户端端口。或者你说的是服务器端口?
  • 服务器端没有问题。服务器从互联网上的另一台计算机发送了我的响应。我可以将请求从服务器发送到特定的客户端本地端口,例如 127.0.0.1:9865 吗?我只能使用 udp 端口​​然后我认为我只能使用端口 53 来发送和接收我的请求。是真的吗?
  • 在向服务器发送消息之前,您可以在客户端中设置源中的任何端口(发送方端口)。服务器可以提取您的源端口并响应相同的端口,例如客户端 1 源端口:10401 -> 服务器:监听端口:2000。服务器响应端口 10401。客户端 2 源端口:10402 -> 服务器:监听端口:2000。服务器响应端口 10402。
  • 首先感谢您的回复但我知道 127.0.0.1 是本地主机我的目的是,如果我从本地主机发送请求,例如 127.0.0.1:8090,原始有效 IP 为 37.65.31.25互联网上的其他计算机是我的服务器。服务器得到我的请求,它想要响应我。服务器可以通过 udp 向我发送请求的本地主机端口 8090 发送请求吗?
【解决方案2】:

如果您想要进行并发连接,请进行多个连接。在客户端上生成一个新的 UDP 连接,服务器端只会打开一个新连接。在客户端的 connection1 上发送的任何内容都会在服务器上的 connection1 上进行,在 connection2 上发送的任何内容都会在连接 2 上接收。

【讨论】:

  • 我认为因为 udp 是无连接协议,并且每个连接都嗅探一个端口,所以我无法使用此解决方案。
  • 不正确,您仍然可以跟踪客户端的端口,这将是一个随机的高值数字。每个线程都与它自己的 IP+Port 组合对话。见fayyazki's comment
  • 你是说我可以从其他国家的服务器发送请求到特定的客户端本地端口吗?例如发送到 127.0.0.1 : 6069
  • 127.0.0.1 不是另一个国家。它是本地主机,即向您本地的同一台机器发送消息。您可以将消息发送到该客户端用来向您发送消息的本地端口上的另一台计算机。在任何 tcp/ip 数据包中查看 wireshark 或其他工具。它包含源端口和目标端口。其中源端口是其他计算机用来向您发送消息的端口,而您仅在该端口上响应它,而不仅仅是任何其他端口。
  • 首先感谢您的回复但我知道 127.0.0.1 是本地主机我的目的是,如果我从本地主机发送请求,例如 127.0.0.1:8090,原始有效 IP 为 37.65.31.25互联网上的其他计算机是我的服务器。服务器得到我的请求,它想要响应我。服务器可以通过 udp 向我发送请求的本地主机端口 8090 发送请求吗?
猜你喜欢
  • 2014-07-13
  • 2011-03-03
  • 2011-09-30
  • 1970-01-01
  • 2015-12-26
  • 1970-01-01
  • 1970-01-01
  • 2017-02-23
  • 2012-03-11
相关资源
最近更新 更多