2013-07-31 45 views
0

訪問服務器套接字我想看到確切的標題,同時使Web請求,所以我想我只是在我的本地機器上創建一個簡單的Java應用程序服務器,並有我的Android應用程序是送我的android應用程序打電話給它。然後只需將請求轉儲到控制檯,以便我可以看到應用程序發送的內容。但是,當我嘗試連接時,應用程序掛起並停止響應。不能與Android應用

我創建了一個簡單的服務器將只接受一個連接,並sysouts它得到的數據。服務器運行良好,如果我從我的計算機上的網絡瀏覽器中打開它,則會從Web瀏覽器請求中打印標題。所以我知道服務器工作正常。

下面是從我的應用程序的代碼:

URL url = new URL("http://192.168.1.11:9000"); 
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
connection.setDoOutput(true); 
connection.connect(); 

PrintWriter writer = new PrintWriter(connection.getOuputStream(), true); 
writer.write("hi"); 
writer.close(); 

簡單。畢竟,我只想要標題。現在我開始沒有帖子和使用:

URL url = new URL("http://192.168.1.11:9000"); 
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 

BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
in.close(); 

但這並不起作用。該應用程序停止響應getInputStream()請求。它只是停下來,不會繼續。服務器也沒有獲得連接請求。

所以在所有的應用程序被阻止的URL連接的的getInputStream,我想不通爲什麼。

現在我已經搜索了一段時間,發現這些:

Android app communicating with server via sockets

socket exception socket not connected android

Android embedded browser cant connect to server on LAN

Using java.net.URLConnection to fire and handle HTTP requests

Client Socket cannot connect to running Socket server

但沒有什麼幫助。我沒有像這個問題似乎是每個人都使用本地主機,我已經嘗試使用Android 10.0.0.2,但也不工作。

我不是限制任何東西(我回來了)在網絡上,我已經使用順序顯示第一組的代碼將消息發送到我的服務器嘗試,但甚至沒有工作(它運行良好但服務器從來沒有得到一個客戶端,這是否工作?)。

我同時使用的URLConnection和HttpURLConnection的嘗試,他們都有同樣的問題。

我也用我的應用程序的Internet權限,所以它也有所需的權限。

在這一點上我很茫然。爲什麼我無法打電話給我的服務器?

編輯

我使用機器人文檔確切的代碼:

private String downloadUrl(String myurl) throws IOException { 
    InputStream is = null; 
    // Only display the first 500 characters of the retrieved 
    // web page content. 
    int len = 500; 

    try { 
     URL url = new URL("http://10.0.2.2:9000"); 
     HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
     conn.setReadTimeout(10000 /* milliseconds */); 
     conn.setConnectTimeout(15000 /* milliseconds */); 
     conn.setRequestMethod("GET"); 
     conn.setDoInput(true); 
     // Starts the query 
     conn.connect(); 
     int response = conn.getResponseCode(); 
     is = conn.getInputStream(); 

     // Convert the InputStream into a string 
     String contentAsString = readIt(is, len); 
     return contentAsString; 

     // Makes sure that the InputStream is closed after the app is 
     // finished using it. 
    } finally { 
     if (is != null) { 
      is.close(); 
     } 
    } 
} 

但即使不工作。它仍然掛起。只有現在它掛在getResponseCode()上。然後引發超時異常。服務器從來沒有收到請求。

+0

我很確定你的logcat告訴你到底是什麼問題。 –

+0

因爲第一組代碼不會引發任何錯誤,所以logcat實際上什麼都沒說。 –

+0

當你說你可以通過網絡瀏覽器訪問網頁時,很好,你的意思是說你可以通過Android設備上的默認網頁瀏覽器來訪問網頁嗎?或者,網絡瀏覽器使用了您的臺式電腦之一? –

回答

0

您的地址必須以'http://'開頭,然後重試!

+0

抱歉在代碼中寫錯了代碼。它實際上是從那開始的,它仍然阻塞。 –

0

我覺得你的問題的根源是,Android是FCing您的應用程序的連接完成之前,因爲我認爲你沒有在裝載機,或的AsyncTask螺紋包裹這一點。我建議您按照培訓指南Google provides,將您的呼叫包裝在AsyncTask中,然後查看是否可以解決問題。

+0

我試着將它移動到它自己的線程,但除了ui沒有凍結之外,沒有改變任何東西。儘管它仍然掛在getInputStream上,但它現在掛在了應用程序而不是應用程序上。任何想法爲什麼? –

0

我有我用做HTTP GET請求的Java類,我是你的使用所以下面我甩了代碼的相關部分猜測其近等同於Android的代碼。我在Java應用程序中多次使用這個類(不是在Android上)。

currentUrl = new URL(getUrl); 
conn = (HttpURLConnection)currentUrl.openConnection(); 
conn.setRequestProperty("Cookie", getCookies(currentUrl.getHost())); 
conn.setRequestProperty("User-Agent", "robadob.org/crawler"); 
if(referrer!=null){conn.setRequestProperty("Referrer",referrer);} 
conn.setRequestMethod("GET"); 
conn.connect(); 
//Get response 
String returnPage = ""; 
String line; 
BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
while ((line = rd.readLine()) != null) { 
    returnPage+=line+"\n"; 
} 
rd.close(); 

我什麼都看不到明顯的是,將導致您的代碼失敗,但希望你能發現這個東西。 setRequestProperty是我設置標題,所以你不應該需要這些。

如果失敗,洪水與System.out中的代碼,所以你可以看到哪些語句中的停頓處。