我制作了一个非常基本的 KryoNet 服务器和客户端程序。如果我通过 localhost 连接客户端,它会按预期工作。现在我想从外部连接到它,所以我用 noip.com 的动态 DNS 工具为自己设置了一个 DNS。当我通过 DNS 连接时,KryoNet 显示了正确的 IP,但无法连接。
服务器:
public class ServerTester {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
Server server = new Server();
server.start();
server.bind(TCP, UDP);
server.getKryo().register(Packet.class);
server.getKryo().register(TestPackage.class);
server.addListener(new Listener() {
public void received (Connection connection, Object object)
{
if (object instanceof Packet)
{
if (object instanceof TestPacket)
{
TestPacket p1 = (TestPacket) object;
System.out.println("server received: " + p1.name);
}
}
}
});
}
}
客户:
public class ClientTester {
public static void main(String[] args) {
Client client = new Client();
client.start();
try {
client.connect(5000, "my.dynamic.dns", TCP, UDP);
} catch (IOException e) {
JOptionPane.showMessageDialog(null, "Could not connect to server");
}
client.getKryo().register(Packet.class);
client.getKryo().register(TestPacket.class);
TestPacketp1 = new TestPacket();
p1.name = "Menno Gouw";
client.sendTCP(p1);
}
}
我在路由器上转发了用于 TCP 和 UDP 的端口。不确定显示端口是否存在安全风险,所以我只是为这个问题编造了一些。我转发了从 ipconfig 获得的 IPv4 地址和我的真实互联网地址的端口。
TCP = 8001
UDP = 8002
Public-Port-Range | Target IP | Target Port Range | Protocol
8001-8002 | IPv4 Address | 8001-8002 | Both
8001-8002 | real Address | 8001-8002 | Both
那么为什么客户端无法连接?是我的端口转发问题还是我的 ISP 以某种方式阻止了此问题?
就像我说的,如果我使用 localhost (127.0.0.1) 让客户端连接到服务器,一切都会按预期进行。当我尝试使用动态 DNS 连接时,我在控制台中收到一条 KryoNet 消息,表示它正在连接到我的“真实”IP 地址:
00:00 INFO: Connecting: my.dynamic.dns/XXX.XXX.XXX.XXX:8001/8002
但 5000 毫秒超时后连接失败。
答案1
如果您尝试从同一网络内进行连接,则无法正常工作。您无法访问自己的外部 IP。
您可以使用端口转发测试器网站(周围有很多)来检查端口是否打开并接受流量,但对于真正的测试,您需要尝试从另一个互联网连接进行连接。
答案2
正如 @Deadly-Bagel 指出的那样,您的调制解调器/路由器可能不允许 NAT 环回,即您的 LAN 客户端无法通过您自己的公共 IP 访问服务(例如 Web 服务器)。
资源:https://en.wikipedia.org/wiki/Network_address_translation#NAT_loopback
可能发生的情况是
- 您的 Kryo 客户端正在连接到您的 DDNS 服务器(通过其 URL)
- DDNS 服务(例如 DynDNS)会告诉您的 Kryo 客户端域的 IP 是什么(即您自己的公共 IP)。
- 然后,您的 Kryo 客户端尝试连接到您自己的公共 IP,但会失败,因为您的调制解调器/路由器无法将请求环回(然后转发)到您的 Kryo 服务器。
对此有几种可能的解决方案:
- 将调制解调器/路由器更改为具有 NAT 环回功能的调制解调器/路由器
- 编辑您正在使用的计算机的
hosts
文件以指向您的 DDNS URL,从而127.0.0.1
产生与您的 DDNS 服务对话的效果。 - 如果您的 Kryo 服务器与 Kryo 客户端位于不同的计算机上,那么您可以将 Kryo 客户端 PC 绑定到您的手机等设备上,并使用您的 3G 连接来测试您的客户端与服务器的连接。
另外,您不应该进行端口转发并将您的公共 IP 设置为 LAN IP - 这样做不行。端口转发的整个目的是将 WAN 端请求定向到 LAN 端设备。