簡體   English   中英

無法使用Android應用訪問服務器套接字

[英]Can't access server socket with android app

我想在發出網絡請求時查看我的android應用程序正在發送的確切標頭,所以我想我只是在本地計算機上用java創建一個簡單的服務器應用程序,然后讓我的android應用程序對其進行調用。 然后只需將請求轉儲到控制台,這樣我就可以查看應用程序正在發送的內容。 但是,當我嘗試連接時,該應用程序掛起並停止響應。

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

這是我的應用程序中的代碼:

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應用程序通過套接字與服務器通信

套接字異常套接字未連接android

Android嵌入式瀏覽器無法連接到局域網上的服務器

使用java.net.URLConnection觸發和處理HTTP請求

客戶端套接字無法連接到正在運行的套接字服務器

但是沒有任何幫助。 我沒有像每個人一樣使用本地主機,似乎有這個問題,並且我嘗試使用androids 10.0.0.2,但這也不起作用。

我不在限制任何內容的網絡上(我在家),並且嘗試使用顯示的第一組代碼將消息發送到服務器,但即使這樣也無法正常工作(運行正常,但服務器從未獲得客戶。如何運作?)。

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

我還在我的應用程序中使用了Internet權限,因此它確實具有所需的權限。

我現在不知所措。 為什么我不能簡單地撥打服務器電話?

編輯

我使用了androids文檔中的確切代碼:

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()上。 然后拋出超時異常。 服務器永遠不會收到請求。

您的地址必須以“ http://”開頭,然后重試!

我認為問題的根源在於,Android在連接完成之前就在FC應用程序,因為我假設您尚未將其包裝在Loader,AsyncTask或Thread中。 我建議您遵循Google提供的培訓指南,將您的呼叫包裝在AsyncTask中,看看是否可以解決問題。

我有一個用於發出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充斥代碼,以便查看停滯在哪條語句。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM