连接在远程IP上被拒绝,但在本地IP上被接受

正如标题所说,我让我的服务器在本地机器上运行,我测试并调试它并且它工作得很好(服务器也用java编写)。 但是,当我尝试用我的远程IP(而不是192.168.0.113,我使用146.255.xx)测试它,并且服务器没有收到任何东西,而客户端抛出这个:

09-04 18:23:27.595: W/System.err(24241): java.net.ConnectException: failed to connect to /146.255.xx (port 4040): connect failed: ECONNREFUSED (Connection refused) 09-04 18:23:27.595: W/System.err(24241): at libcore.io.IoBridge.connect(IoBridge.java:114) 09-04 18:23:27.595: W/System.err(24241): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 09-04 18:23:27.595: W/System.err(24241): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) 09-04 18:23:27.595: W/System.err(24241): at java.net.Socket.startupSocket(Socket.java:566) 09-04 18:23:27.595: W/System.err(24241): at java.net.Socket.tryAllAddresses(Socket.java:127) 09-04 18:23:27.595: W/System.err(24241): at java.net.Socket.(Socket.java:177) 09-04 18:23:27.595: W/System.err(24241): at java.net.Socket.(Socket.java:149) 09-04 18:23:27.595: W/System.err(24241): at com.statenislandchat.Main$2$1$1.run(Main.java:146) 09-04 18:23:27.595: W/System.err(24241): Caused by: libcore.io.ErrnoException: connect failed: ECONNREFUSED (Connection refused) 09-04 18:23:27.595: W/System.err(24241): at libcore.io.Posix.connect(Native Method) 09-04 18:23:27.600: W/System.err(24241): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85) 09-04 18:23:27.600: W/System.err(24241): at libcore.io.IoBridge.connectErrno(IoBridge.java:127) 09-04 18:23:27.600: W/System.err(24241): at libcore.io.IoBridge.connect(IoBridge.java:112) 09-04 18:23:27.600: W/System.err(24241): ... 7 more 

我很久以前在服务器PC上禁用了防火墙,并且我在路由器上转发了端口。 我尝试了一些端口扫描程序,他们都检测到我的端口上的服务,但我的客户端无法一次又一次地访问它。


解决了! 我对网络的关注不多,但如果服务器和客户端都在同一个路由器上,似乎无法像这样连接。 我尝试从远程客户端连接并且它有效。

ECONNREFUSED表示尝试连接,远程主机回答没人在监听该端口。 这可能意味着几件事:

  1. 这真的是你的IP吗? ifconfig / ipconfig说什么(提示:不一定是什么whatismyip.com会说)?
  2. Java服务器是否监听所有接口? 同一端口可以在localhost上打开,在其他接口上关闭。 检查服务器上的绑定地址。
  3. 尝试一个telnet + tcpdump,它是否显示数据包到达正确的地址?

而这些只是一个开始。

我也有问题让我的Android Studio java TCP客户端连接到我的开发机器上的本地服务器。 我通过修复两件事来解决它:

  1. 不要尝试向“127.0.0.1”或“localhost”打开套接字。 而是找出你的本地地址。 在我的情况下,它使用“192.168.0.100”这是我的开发计算机本地地址。

  2. 不要尝试在android java app的主线程中创建“new Socket(address,portnumber)”。 我通过在另一个线程中创建套接字来实现它。 这是一个临时线程,它只创建了Socket并在死亡之前存储了引用。

问题2的例外情况

在主线程中创建套接字时:

 11-29 11:00:35.718 27063-27063 / se.mycompany.tcpclient2 E / AndroidRuntime: 
致命exception:主要
进程:se.mycompany.tcpclient2,PID:27063
 java.lang.IllegalStateException:无法执行android:onClick的方法
在android.support.v7.app.AppCompatViewInflater $ DeclaredOnClickListener.onClick(AppCompatViewInflater.java:275)
 ...