2013-11-22 66 views
1

我已經安裝了一個服務器,在heroku上使用ServerSocket運行。我知道heroku在一個系統定義的變量中定義了端口,我也在使用它。以下是Heroku上的服務器代碼片段。Java客戶端插座不能regonize 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) 

是什麼造成這個錯誤?這不是正確的服務器地址嗎?在服務器端,當接受一個新的連接時,我確實有一個打印語句(測試目的),並從網絡瀏覽器轉到url打印語句,因此heroku接受連接。

另外幾件事情我在Heroku上注意到:

1)每隔幾分鐘端口會從某個IP的連接。在單次運行期間,IP與端口遞增1相同。這些連接是什麼?我能阻止他們嗎? 2)當我使用命令打印變量端口(cmd> heroku run echo $ PORT)時,我意識到這個端口總是與我的服務器啓動時不同。那麼這個行的問題是:System.getenv(「PORT」)?

任何幫助表示讚賞,一直試圖解決這toooooo長。

回答

1

您在主機名字段中包含一個URL。

你想要的主機名:

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

感謝您的及時回覆。試圖改變這一點,這是有道理的,但沒有影響。 – slash

+0

你在這裏使用的應用程序的實際名稱?我假設appname是一個放置者。如果您查找應用程序的DNS名稱,「nslookup YOUR_ACTUAL_APP_NAME.herokuapp.com」 - 是否解決? – Winfield

+0

沒關係,這實際上工作!我忘了從字符串中刪除最後一個'/'。雖然,服務器仍然沒有獲得連接。但這是一個不同的錯誤。接受答案。 – slash

0

夫婦的想法 - 請注意,App主機名是不是在您的應用程序正在運行的計算機的名稱。這是Heroku HTTP路由層的指針。因此,您將無法直接連接到該端口。另外,我相信Heroku使用AWS安全組來限制網絡訪問實際的dynos。他們的網絡模型是爲通過路由網格進行HTTP/S訪問而設計的。任何其他類型的網絡訪問都需要不同的託管解決方案。