我有一个 Play 应用程序连接到 1.2.3.4 的数据库,但由于某种原因 Play!(以及其他Java应用程序(无法连接到它。
我确实尝试编辑主机文件并为 IP 设置名称,例如 app01 1.2.3.4
但它仅适用于托管数据库的盒子,不适用于外部机器。我可以确认正确的端口在iptables中打开,我也尝试重新启动它。
如果我从同一个盒子在端口 4567 的 1.2.3.4 处 ping postgres,它可以工作。但是在我的 java 应用程序中设置相同的 IP 地址失败了。怎么了?是权限问题还是 iptables 问题?谢谢。
堆栈跟踪:
Caused by: java.net.NoRouteToHostException: No route to host
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:327)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:193)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:180)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:384)
at java.net.Socket.connect(Socket.java:546)
at java.net.Socket.connect(Socket.java:495)
at java.net.Socket.<init>(Socket.java:392)
at java.net.Socket.<init>(Socket.java:206)
at org.postgresql.core.PGStream.<init>(PGStream.java:62)
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:76)
... 35 more
您可以通过 pgadmin (http://www.pgadmin.org/( 连接到您的数据库吗?是否可以从计算机远程登录到给定端口上的数据库服务器(telnet 1.2.3.4 4567(?如果您无法远程登录,也许数据库服务器阻止了您的连接?您是否仅为 java 或仅为系统的其余部分设置了任何代理服务器?从例外来看,它似乎比Java的任何事情都更像是一个网络问题......
你能检查数据库服务器上的防火墙设置吗? 您可以尝试通过 telnet 检查您是否能够连接。
如果您在路由器后面,您将能够从另一台本地计算机(使用本地 IP(对其进行 ping,但如果您没有正确进行端口转发,您可能无法从外部 ping (您可以从路由器配置(。
要记住的另一件事是,您不能从网络内部ping自己的外部IP,这意味着您可以从192.168.1.xx(客户端(ping192.168.1.100(服务器(,但不能从192.168.1.xx(客户端(ping72.15.xx.xx(端口转发到192.168.1.100(。
为此,您必须使用外部工具,有许多Web可以为您执行此操作,这是我使用的一个:
http://www.yougetsignal.com/tools/open-ports/
如果它说端口已打开,那么它已打开,现在应该可以工作,如果它显示已关闭,那么您应该仔细检查您的防火墙是否允许数据,也许暂时关闭它以查看它。
如果您需要帮助将端口例外添加到防火墙或从路由器转发端口,只需告诉我您正在使用哪个发行版/路由器型号,我将尝试为您挖掘更多信息。