Java客户端套接字可以';重新定义heroku服务器

Java客户端套接字可以';重新定义heroku服务器,java,android,sockets,heroku,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. " + Intege

我在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)
java.net.UnknownHostException:无法解析主机”http://appname.herokuapp.com“:没有与主机名关联的地址
位于java.net.InetAddress.lookupHostByName(InetAddress.java:424)
位于java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
位于java.net.InetAddress.getAllByName(InetAddress.java:214)
位于java.net.Socket.tryalladdress(Socket.java:108)
位于java.net.Socket(Socket.java:177)
位于java.net.Socket(Socket.java:149)
在com.example.taid.FullscreenActivity.CheckAccount(FullscreenActivity.java:241)上
是什么导致了这个错误?这不是正确的服务器地址吗?在服务器端,在接受一个新连接时,我有一个print语句(测试目的),从web浏览器转到url,它会打印该语句,所以heroku接受连接

我在Heroku上也注意到了几件事:

1) 每隔几分钟,端口就会收到来自某个ip的传入连接。在单次运行期间,ip相同,端口数增加1。这些联系是什么?我能阻止他们吗

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


非常感谢您的帮助,我们已经尝试了很长时间来解决这个问题。

您在主机名字段中包含了一个URL

您需要主机名:

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

您正在主机名字段中包含URL

您需要主机名:

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

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

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

谢谢你的及时回复。尝试更改为此,这是有道理的,但没有任何区别。您在此处使用的是应用程序的实际名称吗?我假设appname是一个placedholder。如果你查找你的应用程序的DNS名称,“nslookup your_ACTUAL_app_name.herokuapp.com”-它能解析吗?没关系,这确实有效!我只是忘了从字符串中删除最后一个“/”。尽管如此,服务器仍然无法获得连接。但这是另一个错误。回答被接受。@slash我知道这是真的延迟,但我认为端口应该是80或443。您的应用程序可能部署在应用程序服务器上的40506处,但要通过主机名ping它,您需要通过Heroku负载平衡器,该平衡器将您的应用程序部署在443tanks处,以获得提示回复。尝试更改为此,这是有道理的,但没有任何区别。您在此处使用的是应用程序的实际名称吗?我假设appname是一个placedholder。如果你查找你的应用程序的DNS名称,“nslookup your_ACTUAL_app_name.herokuapp.com”-它能解析吗?没关系,这确实有效!我只是忘了从字符串中删除最后一个“/”。尽管如此,服务器仍然无法获得连接。但这是另一个错误。回答被接受。@slash我知道这是真的延迟,但我认为端口应该是80或443。您的应用程序可能部署在应用程序服务器上的40506,但要通过主机名ping它,您需要通过Heroku负载平衡器,它将您的应用程序部署在443