我正在用 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/