如何让Java程序在互联网上进行通信?

时间:2015-03-14 17:08:08

标签: java sockets networking network-programming rmi

我正在使用套接字开发客户端/服务器应用程序,这是客户端的基本代码:

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程序之间建立连接呢,它甚至可能吗?这让我想知道我们使用的所有聊天应用程序等等。

请帮帮我!!我会感激任何读我问题并至少提供回复的人。谢谢你的阅读!

1 个答案:

答案 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也可能阻止该端口的流量。在企业网络中,有时也会阻止到任意端口的传出连接。