获取java.net.SocketTimeoutException:android中的连接超时

获取java.net.SocketTimeoutException:android中的连接超时,java,android,httpurlconnection,java-io,Java,Android,Httpurlconnection,Java Io,我对安卓系统的开发还比较陌生。我正在开发一个android应用程序,向web服务器发送请求并解析JSON对象。我经常在与服务器通信时遇到java.net.SocketTimeoutException:Connection超时异常。有时,它会毫无问题地完美工作。 我知道这个问题已经被问了很多次了。但是,我仍然没有得到任何令人满意的解决这个问题的办法。我在下面发布我的logcat和应用服务器通信代码 public JSONObject RequestWithHttpUrlConn(String _u

我对安卓系统的开发还比较陌生。我正在开发一个android应用程序,向web服务器发送请求并解析JSON对象。我经常在与服务器通信时遇到
java.net.SocketTimeoutException:Connection超时
异常。有时,它会毫无问题地完美工作。 我知道这个问题已经被问了很多次了。但是,我仍然没有得到任何令人满意的解决这个问题的办法。我在下面发布我的logcat和应用服务器通信代码

public JSONObject RequestWithHttpUrlConn(String _url, String param){

    HttpURLConnection con = null;
    URL url;
    String response = "";
    Scanner inStream = null;
    PrintWriter out = null;
    try {
        url = new URL(_url);
        con = (HttpURLConnection) url.openConnection();
        con.setDoOutput(true);
        con.setRequestMethod("POST");
        if(param != null){
            con.setFixedLengthStreamingMode(param.getBytes().length);
        }
        con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        out = new PrintWriter(con.getOutputStream());
        if(param != null){
            out.print(param);
        }
        out.flush();
        out.close();
        inStream = new Scanner(con.getInputStream());

        while(inStream.hasNextLine()){
            response+=(inStream.nextLine());
        }
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } finally{
        if(con != null){
            con.disconnect();
        }if(inStream != null){
            inStream.close();
        }if(out != null){
            out.flush();
            out.close();
        }
    }
}
日志:

03-25 10:55:32.613: W/System.err(18868): java.net.SocketTimeoutException: Connection 
timed out
03-25 10:55:32.617: W/System.err(18868):at org.apache.harmony.luni.platform.OSNetworkSystem.connect(Native Method)
03-25 10:55:32.617: W/System.err(18868):at dalvik.system.BlockGuard
$WrappedNetworkSystem.connect(BlockGuard.java:357)
03-25 10:55:32.617: W/System.err(18868):at 
org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:204)
03-25 10:55:32.617: W/System.err(18868):at 
org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:437)
03-25 10:55:32.617: W/System.err(18868):at        java.net.Socket.connect(Socket.java:1002)
03-25 10:55:32.621: W/System.err(18868):at 
org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>
(HttpConnection.java:75)
03-25 10:55:32.621: W/System.err(18868): at 
org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>
(HttpConnection.java:48)03-25 10:55:32.624: W/System.err(18868):at 
org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection$Address.connect
(HttpConnection.java:322)03-25 10:55:32.624: W/System.err(18868):at 
org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionPool.get
(HttpConnectionPool.java:89)03-25 10:55:32.628: W/System.err(18868):at 
org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getHttpCon
nection(HttpURLConnectionImpl.java:285)
03-25 10:55:32.628: W/System.err(18868):at     org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.makeConn
ection(HttpURLConnectionImpl.java:267)
03-25 10:55:32.636: W/System.err(18868):at
org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connect
(HttpURLConnectionImpl.java:205)
03-25 10:55:32.636: W/System.err(18868):at 
org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getOutputS
tream(HttpURLConnectionImpl.java:614)
03-25 10:55:32.636: W/System.err(18868):at 
com.myapp.core.JSONRequest.RequestWithHttpUrlConn(JSONRequest.java:63)
03-25 10:55:32.636: W/System.err(18868):    at com.myapp.core.DetailPage
$AsyncRecBooks.doInBackground(AKBookDetailView.java:265)
03-25 10:55:32.640: W/System.err(18868):    at com.myapp.core.DetailPage
$AsyncRecBooks.doInBackground(AKBookDetailView.java:1)
03-25 10:55:32.640: W/System.err(18868):    at android.os.AsyncTask$2.call
(AsyncTask.java:185)
03-25 10:55:32.640: W/System.err(18868):    at java.util.concurrent.FutureTask
$Sync.innerRun(FutureTask.java:306)
03-25 10:55:32.640: W/System.err(18868):    at java.util.concurrent.FutureTask.run
(FutureTask.java:138)
03-25 10:55:32.640: W/System.err(18868):    at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
03-25 10:55:32.648: W/System.err(18868):    at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
03-25 10:55:32.648: W/System.err(18868):    at java.lang.Thread.run(Thread.java:1019)
03-25 10:55:32.652: E/JSON Parser(18868): Error parsing data org.json.JSONException:  
End of input at character 0 of 
03-25 10:55:32.613:W/System.err(18868):java.net.SocketTimeoutException:Connection
超时
03-25 10:55:32.617:W/System.err(18868):位于org.apache.harmony.luni.platform.OSNetworkSystem.connect(本机方法)
03-25 10:55:32.617:W/System.err(18868):在dalvik.System.BlockGuard
$WrappedNetworkSystem.connect(BlockGuard.java:357)
03-25 10:55:32.617:带系统错误(18868):在
org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:204)
03-25 10:55:32.617:带系统错误(18868):在
org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:437)
03-25 10:55:32.617:W/System.err(18868):位于java.net.Socket.connect(Socket.java:1002)
03-25 10:55:32.621:W/系统错误(18868):在
org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection。
(HttpConnection.java:75)
03-25 10:55:32.621:W/系统错误(18868):在
org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection。
(HttpConnection.java:48)03-25 10:55:32.624:W/System.err(18868):at
org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection$Address.connect
(HttpConnection.java:322)03-2510:55:32.624:W/System.err(18868):at
org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionPool.get
(HttpConnectionPool.java:89)03-25 10:55:32.628:W/System.err(18868):at
org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getHttpCon
连接(HttpURLConnectionImpl.java:285)
03-25 10:55:32.628:W/System.err(18868):位于org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.makeConn
section(HttpURLConnectionImpl.java:267)
03-25 10:55:32.636:W/系统错误(18868):在
org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connect
(HttpURLConnectionImpl.java:205)
03-25 10:55:32.636:W/系统错误(18868):在
org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getOutputS
Stream(HttpURLConnectionImpl.java:614)
03-25 10:55:32.636:W/系统错误(18868):在
com.myapp.core.JSONRequest.RequestWithHttpUrlConn(JSONRequest.java:63)
03-25 10:55:32.636:W/System.err(18868):在com.myapp.core.DetailPage
$AsyncRecBooks.doInBackground(AKBookDetailView.java:265)
03-25 10:55:32.640:W/System.err(18868):在com.myapp.core.DetailPage
$AsyncRecBooks.doInBackground(AKBookDetailView.java:1)
03-25 10:55:32.640:W/System.err(18868):在android.os.AsyncTask$2.call
(AsyncTask.java:185)
03-25 10:55:32.640:W/System.err(18868):位于java.util.concurrent.FutureTask
$Sync.innerRun(FutureTask.java:306)
03-25 10:55:32.640:W/System.err(18868):位于java.util.concurrent.FutureTask.run
(FutureTask.java:138)
03-25 10:55:32.640:W/系统错误(18868):在
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
03-25 10:55:32.648:W/系统错误(18868):在
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
03-25 10:55:32.648:W/System.err(18868):位于java.lang.Thread.run(Thread.java:1019)
03-25 10:55:32.652:E/JSON解析器(18868):解析数据org.JSON.JSONException时出错:
在的字符0处输入结束

有人能帮我找到解决办法吗?提前感谢….

我在网上搜索了很多关于连接超时异常的文档,在阅读了大量文档之后,我了解到,防止
SocketTimeoutException
超出了我们的限制。有效处理它的一种方法是定义连接超时,然后使用
try-catch
块来处理它。希望这将有助于今后面临同样问题的任何人

HttpUrlConnection conn=(HttpUrlConnection)url.openConnection();
//以毫秒为单位设置超时
连接设置连接超时(7000);

我知道这个问题有点老了。但由于我在做研究的时候偶然发现了这一点,我认为添加一点可能会有所帮助

如上所述,客户机无法解决该错误,因为这是一个与网络相关的问题。但是,您可以做的是重试连接几次。在真正的问题得到解决之前,这可能是一个解决办法

for (int retries = 0; retries < 3; retries++) {
    try {
        final HttpClient client = createHttpClientWithDefaultSocketFactory(null, null);
        final HttpResponse response = client.execute(get);
        final int statusCode = response.getStatusLine().getStatusCode();
        if (statusCode != 200) {
            throw new IllegalStateException("GET Request on '" + get.getURI().toString() + "' resulted in " + statusCode);
        } else {                
            return response.getEntity();
        }
    } catch (final java.net.SocketTimeoutException e) {
        // connection timed out...let's try again                
    }
}
for(int retries=0;retries<3;retries++){
试一试{
最终HttpClient客户端=createHttpClientWithDefaultSocketFactory(null,null);
最终HttpResponse响应=client.execute(get);
final int statusCode=response.getStatusLine().getStatusCode();
如果(状态代码!=200){
抛出新的IllegalStateException(“在“+GET.getURI().toString()+”上获取请求导致“+statusCode”);
}否则{
返回response.getEntity();
}
}捕获(最终java.net.SocketTimeoutException e){
//连接超时…让我们重试
}
}

也许这对某人有帮助。

如果您在本地主机上测试服务器,您的Android设备必须连接到同一个本地网络。然后,应用程序使用的服务器URL必须包含您的计算机IP地址,而不是“本地主机”掩码。

我遇到了这个问题,解决方案是重新启动调制解调器(路由器)。在那之后,我可以将我的应用程序连接到互联网


我认为我正在使用的库没有正确管理连接,因为它只发生过几次。

我错误地更改了语句的顺序,因此出现了相同的错误

OkHttpClient okHttpClient = new OkHttpClient().newBuilder() .connectTimeout(20, TimeUnit.SECONDS).readTimeout(20,TimeUnit.SECONDS).writeTimeout(20, TimeUnit.SECONDS) .build();
更改writeTimeout和
OkHttpClient okHttpClient = new OkHttpClient().newBuilder() .connectTimeout(20, TimeUnit.SECONDS).readTimeout(20,TimeUnit.SECONDS).writeTimeout(20, TimeUnit.SECONDS) .build();
OkHttpClient okHttpClient = new OkHttpClient.Builder().connectTimeout(60, TimeUnit.SECONDS)
                    .writeTimeout(60, TimeUnit.SECONDS)
                    .readTimeout(60, TimeUnit.SECONDS)
                    .build();
val httpClient = OkHttpClient.Builder()
        httpClient.connectTimeout(5, TimeUnit.MINUTES) // connect timeout
            .writeTimeout(5, TimeUnit.MINUTES) // write timeout
            .readTimeout(5, TimeUnit.MINUTES) // read timeout
viewModelScope.launch(Dispatchers.IO) {
        try {
            val userListResponseModel = apiEndPointsInterface.usersList()
            returnusersList(userListResponseModel)
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
@GET(AppConstants.APIEndPoints.HOME_CONTENT)
suspend fun usersList(): UserListResponseModel
OkHttpClient.Builder()
            .connectTimeout(10, TimeUnit.SECONDS)
            .readTimeout(10, TimeUnit.SECONDS)
            .writeTimeout(10, TimeUnit.SECONDS)