java - 服务器UDP和端口绑定(bind)

标签 java networking udp

我正在用 Java 编写这个游戏,并且遇到网络架构问题。

我决定使用UDP数据包。我才刚刚开始,但我面临的问题是,当客户端连接该服务器时,服务器似乎必须从完全相同的 IP/端口响应客户端(位于使用 NAT 的路由器后面)。

例如,我在路由器后面有客户端 A。客户端 A 的 IP(本地)为 192.168.8.100,它从端口 1234 连接服务器 B。服务器位于 11.11.11.11:2345。

当客户端 A 连接到服务器 B 时,它使用 192.168.8.100:1234,但路由器会将其转换为(例如)22.22.22.22:6789。

现在,当服务器想要向该客户端发送数据包时,数据包必须来自 11.11.11.11:2345。 我想从另一个端口发送数据,例如 11.11.11.11:2222,但这似乎不起作用,至少对我的路由器不起作用。

我想使用不同的端口,因为我想要有两个线程,一个用于监听,一个用于发送数据,并且每个线程都有自己的 DatagramSocket。但是,正如我所说,一旦客户端 A 通过端口 2345 连接到服务器,我就无法从端口 2222 发送数据。

有人知道这是怎么处理的吗?我是用 Java 做的,但这并不是一个特定于语言的问题。

更新

@Perception 发表评论后,我对他的评论还有一些疑问:

好吧,如果我理解正确的话,如果我有一个托管 1000 个游戏的服务器,每个游戏有 2 个玩家,那么所有发送/接收都必须通过同一个 DatagramSocket 完成。

据我了解 DatagramSocket 是线程安全的,所以我想我可以让一个线程执行以下操作:

datagramSocket.receive();

同时第二个线程正在执行

datagramSocket.send(.....);

正确吗?

还有,两个线程可以通过同一个DatagramSocket同时发送数据吗?发送是否以任何方式序列化,这意味着第二个 send() 仅在前一个 send() 完成后才开始,或者数据同时发送?

最佳答案

gorann,我不确定我是否正确理解您的意思,但听起来您正在尝试控制服务器与客户端通信的端口。没有办法控制这一点,并且有充分的理由。

关于java - 服务器UDP和端口绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8731873/

相关文章:

networking - 从Virtualbox Guest到DynDNS地址的SSH

c++ - Linux C++ : Accessing network statistics

C UDP套接字,在recvfrom检索之前数据包存储在哪里?

c++ - 'avct' 是合法的 long 值还是合法的 var/const?

C# UDP Socket 不监听响应?

Java 枚举返回 Null

Java8 Lambda 和异常

networking - 尝试连接到自身时,带有 Docker 的 Centos VM 无法访问主机

java - 如何在基于 Struts 桥的 portlet 链接中设置 WindowState?

java - 如何在 jOOQ 查询中使用 Postgres 的 to_char?