Java客户端套接字无法识别heroku服务器

时间:2013-11-22 04:38:45

标签: java android sockets heroku

我在heroku上设置了使用ServerSocket运行的服务器。我知道heroku在系统定义的变量中定义了端口,我也在使用它。这是Heroku上服务器代码的片段。

ServerSocket serverSocket = null;
try {
   serverSocket = new ServerSocket(Integer.parseInt(System.getenv("PORT"));
   System.out.println("Booted server.  " + Integer.parseInt(System.getenv("PORT"));
   System.out.println(serverSocket);
} catch (IOException e) {
   System.err.println("Could not listen on port: " + Integer.parseInt(System.getenv("PORT"));
   System.exit(1);
}
Socket clientSocket = null;
    try {
        while (true) {
            clientSocket = serverSocket.accept()
            ConnectionHandler c = new ConnectionHandler(clientSocket);
        }

运行并检查heroku日志表明服务器运行正常,

2013-11-22T03:02:21.940969+00:00 app[web.1]: Booted server.  40506
2013-11-22T03:02:21.953200+00:00 app[web.1]: ServerSocket[addr=0.0.0.0/0.0.0.0,localport=40506]

接下来,我正在运行一个需要发送/接收信息的Android应用。以下是连接到端口的代码片段。

clientSocket = new Socket(http://appname.herokuapp.com, 40506);

但是我在上面一行的logcat中得到以下内容:

java.net.UnknownHostException: Unable to resolve host "http://appname.herokuapp.com": No address associated with hostname
at java.net.InetAddress.lookupHostByName(InetAddress.java:424)
at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
at java.net.InetAddress.getAllByName(InetAddress.java:214)
at java.net.Socket.tryAllAddresses(Socket.java:108)
at java.net.Socket.<init>(Socket.java:177)
at java.net.Socket.<init>(Socket.java:149)
at com.example.taid.FullscreenActivity.CheckAccount(FullscreenActivity.java:241)

导致此错误的原因是什么?这不是正确的服务器地址吗?在服务器端,在接受新连接时,我确实有一个打印语句(测试目的),并从Web浏览器转到URL打印语句,因此heroku接受连接。

我在Heroku上发现了几件事:

1)每隔几分钟,端口就会从某个ip获取传入连接。在单次运行期间,ip是相同的,端口递增1.这些连接是什么?我可以阻止他们吗?

2)当我使用命令打印变量端口(cmd&gt; heroku run echo $ PORT)时,我意识到这个端口总是与我的服务器启动时不同。这行的问题也是如此:System.getenv(“PORT”)??

感谢任何帮助,一直试图解决这个问题太久了。

2 个答案:

答案 0 :(得分:1)

您在主机名字段中包含了一个网址。

您需要主机名:

clientSocket = new Socket("appname.herokuapp.com", 40506);

答案 1 :(得分:0)

一些想法 - 请注意,应用主机名不是运行应用的计算机的名称。它是指向Heroku的HTTP路由层的指针。因此,无论如何,您将无法直接连接到该端口。此外,我相信Heroku使用AWS安全组限制对实际动态的网络访问。他们的网络模型是通过路由网格为HTTP / S访问而设计的。任何其他类型的网络访问都需要不同的托管解决方案。