1

Android アプリで実行している Web サーバーに接続しようとしていますが、何らかの理由で失敗しています。

通常どおり Web ページに接続でき、携帯電話のブラウザーを使用して、以下のコードを使用して Google に接続することもできますが、何らかの理由でコードが Web サーバーに接続しません。サーバーをポート 80 でホストすると、毎回エラー コード 503 が表示されます。ポート 8080 (これが望ましい) でホストすると、以下のタイムアウト例外が発生します。

03-05 20:12:22.432: WARN/System.err(29254): java.net.SocketException: The operation timed out
03-05 20:12:22.602: WARN/System.err(29254):     at org.apache.harmony.luni.platform.OSNetworkSystem.connectSocketImpl(Native Method)
03-05 20:12:22.602: WARN/System.err(29254):     at org.apache.harmony.luni.platform.OSNetworkSystem.connect(OSNetworkSystem.java:125)
03-05 20:12:22.602: WARN/System.err(29254):     at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:227)
03-05 20:12:22.612: WARN/System.err(29254):     at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:521)
03-05 20:12:22.612: WARN/System.err(29254):     at java.net.Socket.connect(Socket.java:1019)
03-05 20:12:22.612: WARN/System.err(29254):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:67)
03-05 20:12:22.612: WARN/System.err(29254):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionManager$ConnectionPool.getHttpConnection(HttpConnectionManager.java:151)
03-05 20:12:22.612: WARN/System.err(29254):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionManager.getConnection(HttpConnectionManager.java:73)
03-05 20:12:22.612: WARN/System.err(29254):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection.getHTTPConnection(HttpURLConnection.java:826)
03-05 20:12:22.612: WARN/System.err(29254):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:812)
03-05 20:12:22.612: WARN/System.err(29254):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection.getResponseCode(HttpURLConnection.java:1275)
03-05 20:12:22.612: WARN/System.err(29254):     at com.project.library.remailer.ServerSelect.downloadDirectory(ServerSelect.java:84)
03-05 20:12:22.622: WARN/System.err(29254):     at com.project.main.NewMessage$3$1$1.run(NewMessage.java:156)

コードは次のとおりです。

try {
    URL url = new URL(directoryLocation);
    HttpURLConnection httpURLConnection = (HttpURLConnection) url
            .openConnection();

    // The line below is where the exception is called
    int response = httpURLConnection.getResponseCode();                 
    if (response == HttpURLConnection.HTTP_OK) {


        // Response successful
    InputStream inputStream = httpURLConnection.getInputStream();

    // Parse it line by line
    BufferedReader bufferedReader = new BufferedReader(
                new InputStreamReader(inputStream));
    String temp;
    while ((temp = bufferedReader.readLine()) != null) {
        // Parsing of data here
    }
       } else {
            Log.e("SAMES", "INCORRECT RETURN CODE: " + response);
       }
} catch (MalformedURLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

ポート 8080 に対して CommonsWare によって提案されたリンクのコードを試すと、以前と同じエラー、タイムアウト例外が発生します。ポート 80 の場合、次の例外が発生します。これらのエラーはどちらも url.openStream() で発生します。

ポート 80 の例外:

03-06 11:53:53.296: WARN/System.err(639): java.io.FileNotFoundException: http://64.197.194.165:80/path
03-06 11:53:53.376: WARN/System.err(639):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1064)
03-06 11:53:53.376: WARN/System.err(639):     at java.net.URL.openStream(URL.java:674)
03-06 11:53:53.376: WARN/System.err(639):     at com.project.library.remailer.ServerSelect.downloadDirectory(ServerSelect.java:118)
03-06 11:53:53.376: WARN/System.err(639):     at com.project.main.NewMessage$3$1$1.run(NewMessage.java:156)

また、次のコードを使用してみました。

HttpClient client = new DefaultHttpClient();
        HttpGet request = new HttpGet(directoryLocation);
        try
        {
            HttpResponse response = client.execute(request);
            BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
            String line;
            while((line = reader.readLine()) != null) {
                Log.e("SAMES", line);
        }

    }
    catch(Exception e)
    {
        e.printStackTrace();
    }

ただし、ポート 8080 に対して同じタイムアウト エラーが発生しました。これは、client.execute(response) が呼び出されたときに発生します。

ポート80の場合、接続できなかったというWebページが表示されます。これは多くのHTML編集ですが、ページに記載されている主なことは次のとおりです。

03-06 13:10:23.576: エラー/SAMES(1267): Web サーバーがダウンしているか、ビジー状態であるか、他の問題が発生して要求に応答できない可能性があります。後で再試行することをお勧めします。

4

4 に答える 4

1

各種注意事項:

  • タイムアウトが発生した場所を示しません。
  • この例では、URL を実際とは異なる方法で使用しています。
  • ポート 80 のエラー コード 503 は、サーバーに関する有用なエラー情報をもたらすはずです。
  • 電話機と Web サーバーの間にプロキシ サーバーまたはその他のものがありませんか?
  • WiFi と 3G の両方で試しましたか?
  • HttpClient に切り替えてみて、より良い結果やより良いエラー メッセージが得られるかどうかを確認してください。
于 2010-03-05T21:36:55.427 に答える
1

あなたの問題は(私の意見では)複雑すぎて完全に対処できないため、最近発生した問題についての調査結果を共有したいと思います。

// The line below is where the exception is called
int response = httpURLConnection.getResponseCode();

私のクラスの1つで同じコードが発生IOExceptionしました-毎回、すべての validURLで、問題がコードにあることは明らかでした-それはあなたのものと同じように見えました-単純で、ヘッダーが設定されておらず、チュートリアルのような例の上には何もありません。次に、私が見たすべての例がURLConnection.connect()メソッドを呼び出すことさえしていないことに気付きました - それで私は考えました:実際の接続はいつ発生しますか? 標準的なHttpURLConnection使用パターンはどのように見えますか?

残念ながら、そのトピックに関するドキュメントはほとんどありません。だから私はいくつかのグーグルを行って、このブログ投稿を見つけました: HttpURLConnection's Dark Secrets - by Tim Brayは、より複雑なHttpURLConnectionuse-ceses を書くのに非常に貴重でした。また、私の問題に対する答えも提供しました-関連する行を引用させてください:

// this opens a connection, then sends GET & headers 
in = conn.getInputStream(); 

// can't get status before getInputStream.  If you try, you'll
//  get a nasty exception.
http_status = conn.getResponseCode();

// better check it first
if (http_status / 100 != 2) {
   // redirects, server errors, lions and tigers and bears! Oh my!
}

1 番目と 2 番目のコメントを参照してください。HttpURLConnection.getInputStream()実際のネットワーク接続が(HttpURLConnection.getOutputStream()コンテンツをサーバーに送信している場合) によって開始されることがわかっている場合、これは非常に理にかなっています。私の問題を修正しgetResponseCode() た後 に呼び出しを配置し​​ます。getInputStream()

于 2012-12-04T16:48:47.120 に答える
0

httpURLConnection.connect()に電話した後に電話をかけてみるとどうなりますurl.openConnection()か?

于 2010-03-05T21:35:09.203 に答える
-2

root 権限を持つアプリのみが 1024 未満のポートを開くことができます。これはポート 80 の問題です。

于 2011-02-17T22:33:31.103 に答える