android-How to solve the 'Connection reset' error when using android volley to connect internet services?

1. Purpose

In this post, I would demo how to solve the connection reset error when using volley http client to access internet:

2. Environment

  • Android Studio 3.x
  • Last Update Date: 2021.8

3. The problem

When we do a simple http post using volley , sometimes, we get this exception:

E/xxx: add group failed dddd
    java.util.concurrent.ExecutionException: com.android.volley.NoConnectionError: java.net.SocketException: Connection reset
        at com.android.volley.toolbox.RequestFuture.doGet(RequestFuture.java:124)
        at com.android.volley.toolbox.RequestFuture.get(RequestFuture.java:97)
        at com.xxx.yyy.utils.VolleyHttpUtils.doPostStringSync(VolleyHttpUtils.java:140)
        at com.xxx.yyy.utils.JSONUtils.postJsonReturnString(JSONUtils.java:445)
        at com.xxx.yyy.ui.rule.zzz.doRealCreateNewGroupTask(EditFwdByNetGroupTargetsActivity.java:291)
        at com.xxx.yyy.ui.rule.zzz.access$400(EditFwdByNetGroupTargetsActivity.java:84)
        at com.xxx.yyy.ui.rule.zzz$6.subscribe(EditFwdByNetGroupTargetsActivity.java:254)
        at io.reactivex.internal.operators.observable.ObservableCreate.subscribeActual(ObservableCreate.java:40)
        at io.reactivex.Observable.subscribe(Observable.java:12030)
        at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeTask.run(ObservableSubscribeOn.java:96)
        at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:579)
        at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:66)
        at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:57)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:923)
     Caused by: com.android.volley.NoConnectionError: java.net.SocketException: Connection reset
        at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:181)
        at com.android.volley.NetworkDispatcher.processRequest(NetworkDispatcher.java:131)
        at com.android.volley.NetworkDispatcher.processRequest(NetworkDispatcher.java:111)
        at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:90)
     Caused by: java.net.SocketException: Connection reset
        at java.net.SocketInputStream.read(SocketInputStream.java:215)
        at java.net.SocketInputStream.read(SocketInputStream.java:144)
        at com.android.org.conscrypt.ConscryptEngineSocket$SSLInputStream.readFromSocket(ConscryptEngineSocket.java:936)
        at com.android.org.conscrypt.ConscryptEngineSocket$SSLInputStream.processDataFromSocket(ConscryptEngineSocket.java:900)
        at com.android.org.conscrypt.ConscryptEngineSocket$SSLInputStream.access$100(ConscryptEngineSocket.java:722)
        at com.android.org.conscrypt.ConscryptEngineSocket.doHandshake(ConscryptEngineSocket.java:238)
        at com.android.org.conscrypt.ConscryptEngineSocket.startHandshake(ConscryptEngineSocket.java:217)
        at com.android.okhttp.internal.io.RealConnection.connectTls(RealConnection.java:196)
        at com.android.okhttp.internal.io.RealConnection.connectSocket(RealConnection.java:153)
        at com.android.okhttp.internal.io.RealConnection.connect(RealConnection.java:116)
        at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:186)
        at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:128)
        at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:97)
        at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:289)
        at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:232)
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:465)
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:131)
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:262)
        at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getOutputStream(DelegatingHttpsURLConnection.java:219)
        at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:30)
        at com.android.volley.toolbox.HurlStack.addBody(HurlStack.java:292)
        at com.android.volley.toolbox.HurlStack.addBodyIfExists(HurlStack.java:277)
        at com.android.volley.toolbox.HurlStack.setConnectionParametersForRequest(HurlStack.java:249)
        at com.android.volley.toolbox.HurlStack.executeRequest(HurlStack.java:94)
        at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:123)
        	... 3 more
V/FA: Inactivity, disconnecting from the service


Here is the code that we used to connect internet and do HTTP post:

 public static String doPostStringSync(Context context, final String url, String body) throws Exception {
        RequestFuture<String> requestFuture=RequestFuture.newFuture();
        StringRequest postRequest = new MyStringRequest(Request.Method.POST,
                url,requestFuture,requestFuture) {
            @Override
            public Map<String, String> getHeaders() {
                HashMap<String, String> headers = new HashMap<String, String>();
                headers.put("Accept", "application/json");
                headers.put("Content-Type", "application/json; charset=UTF-8");
                return headers;
            }
            @Override
            public byte[] getBody() throws AuthFailureError {
                try {
                    return body.getBytes("utf-8");
                } catch (UnsupportedEncodingException e) {
                    LogUtils.error("",e);
                }
                return null;
            }

            @Override
            public String getBodyContentType() {
                return "application/json; charset=utf-8";
            }
        };
        VolleySingleton.getInstance(context).addToRequestQueue(postRequest);
        return requestFuture.get(DEFAULT_TIMEOUT, TimeUnit.SECONDS);
    }

4. The Solution

Turn on the mobile phone’s wifi hotspot, let the computer connect to this hotspot. Then test again. It works!

5. Summary

In this post, I demonstrated how to fix the internet-connection-problem when using android volley.