我正在使用套接字开发客户端/服务器应用程序,这是客户端的基本代码:
Socket sock = new Socket("serversip",9999);
PrintStream pr = new PrintStream(sock.getOutputStream());
这是服务器:
ServerSocket ser = new ServerSocket(9999);
Socket sock = ser.accept();
BufferedReader ed = new BufferedReader(new InputStreamReader(sock.getInputStream()));
每当客户端和服务器应用程序在同一个网络上时,这绝对完美无缺(我使用Inet.getLocalhost()并手动将服务器的ip提供给客户端)
但是当他们在不同的网络(即互联网)上时,我会使用:
URL whatismyip = new URL("http://checkip.amazonaws.com");
BufferedReader in = new BufferedReader(new InputStreamReader(
whatismyip.openStream()));
String ipp = in.readLine();
获取服务器的公共IP地址并手动将其提供给客户端,它将无法正常工作。
它总是说:
java.net.ConnectException: Connection timed out: connect
之前我使用过Java RMI,它也给出了相同的结果,即没有在互联网上工作,只是在私人网络上工作。
那么,我怎么能在互联网上的远程java程序之间建立连接呢,它甚至可能吗?这让我想知道我们使用的所有聊天应用程序等等。
请帮帮我!!我会感激任何读我问题并至少提供回复的人。谢谢你的阅读!
答案 0 :(得分:0)
checkip
返回服务器的公共IP,但很可能服务器位于NAT之后。在这种情况下,服务器是Local Area Network的一部分,它具有本地IP地址(例如192.168.1.2)。您必须将NAT设备上的端口9999(例如,ISP在住宅连接中提供的路由器)映射到服务器上的同一端口192.168.1.2。有些ISP管理NAT本身,不允许用户配置它们。
要考虑的另一点是firewalls。在服务器本身上运行(软件)防火墙(例如Windows防火墙或Linux中的iptables),并且客户端可能存在阻止到端口9999的传出连接的防火墙。在这种情况下住宅连接,ISP也可能阻止该端口的流量。在企业网络中,有时也会阻止到任意端口的传出连接。