1

我正在尝试连接在我的 android 应用程序中运行的 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();
}

当我尝试 CommonsWare 为端口 8080 建议的链接中的代码时,我得到与以前相同的错误,即超时异常。对于端口 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,我得到一个网页,上面说它无法连接,其中很多 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();

在我的一个类中导致的同一段代码IOException- 每次,在每个有效URL的,所以很明显问题出在代码中 - 看起来和你的一样 - 简单,没有设置标题,上面没有类似教程的例子。然后我注意到我看到的每个示例甚至都没有调用URLConnection.connect()方法 - 所以我想:实际连接何时发生?标准HttpURLConnection使用模式是什么样的?

不幸的是,关于该主题的文档很少。所以我做了一些谷歌搜索,发现了这篇博文:HttpURLConnection's Dark Secrets - by Tim Bray,这对于编写更复杂HttpURLConnection的用例来说是无价的。它还为我的问题提供了答案 - 让我引用相关行:

// 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!
}

看到第一条和第二条评论了吗?HttpURLConnection.getInputStream()好吧,当您知道实际的网络连接是由(HttpURLConnection.getOutputStream()如果您将任何内容发送到服务器)发起时,这很有意义。调用getResponseCode() after 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 回答