我需要在我的开发机器和另一种类型的服务器机器之间建立TCP连接。两者都在同一个路由器内,在同一个公共IP下。
当我尝试使用路由器的公共IP在这些设备之间创建TCP连接时,我无法建立连接。连接尝试失败。
我已经在我的路由器中配置了所有的东西,并且我已经用一个简单的Python TCP脚本使用公共IP测试了端口转发。它工作正常!此外,当我使用私有IP时,TCP连接的建立没有任何问题。
开发机器:MacBook
代码:
new InetSocketAddress(serverIpAddress, serverTcpPort)
例外情况:
Bind failed for TCP channel on endpoint [/<My Public Ip>:8132]
java.net.BindException: Can't assign requested address
at java.base/sun.nio.ch.Net.bind0(Native Method)
at java.base/sun.nio.ch.Net.bind(Net.java:459)
at java.base/sun.nio.ch.Net.bind(Net.java:448)
at java.base/sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:227)
at java.base/sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:80)
at akka.io.TcpListener.liftedTree1$1(TcpListener.scala:59)
at akka.io.TcpListener.<init>(TcpListener.scala:56)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
at akka.util.Reflect$.instantiate(Reflect.scala:68)
at akka.actor.ArgsReflectConstructor.produce(IndirectActorProducer.scala:101)
at akka.actor.Props.newActor(Props.scala:212)
at akka.actor.ActorCell.newActor(ActorCell.scala:650)
at akka.actor.ActorCell.create(ActorCell.scala:676)
at akka.actor.ActorCell.invokeAll$1(ActorCell.scala:549)
at akka.actor.ActorCell.systemInvoke(ActorCell.scala:571)
at akka.dispatch.Mailbox.processAllSystemMessages(Mailbox.scala:293)
at akka.dispatch.Mailbox.run(Mailbox.scala:228)
at akka.dispatch.Mailbox.exec(Mailbox.scala:241)
at akka.dispatch.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
at akka.dispatch.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
at akka.dispatch.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
at akka.dispatch.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
如何解决此问题?我想知道为什么它可以用我的私人IP,但不能用公共IP。
此外,我不小心输入了一个私人IP地址,但连接仍然失败。
TCP套接字服务器是否在尝试绑定端口时检查客户端是否可用?
1条答案
按热度按时间w3nuxt5m1#
当我尝试使用路由器的公共IP在这些设备之间创建TCP连接时,我无法建立连接。连接尝试失败。
您不能绑定到未分配给该计算机的IP地址。您需要绑定到路由器地址或机器的LAN地址。
请注意,您仍然可能无法从LAN内部访问路由器的公共IP地址上的计算机。这需要路由器支持发夹NAT,但并非所有路由器都支持。