SocketException: Connected reset after moving from Android Emulator to physical device

136 Views Asked by At

I am trying to talk to my local API to log in, which was very smooth when I used Android emulator. But as soon as I used my Samsung phone as a debugging device, it gave java.net.SocketException. There was no request sent to API.

I am new to Java Socket, so I don't know where to start. How would you go about this?

W/System.err: java.net.SocketException: Connection reset
W/System.err:     at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:121)
W/System.err:     at java.net.SocketOutputStream.write(SocketOutputStream.java:161)
W/System.err:     at okio.Okio$1.write(Okio.java:79)
W/System.err:     at okio.AsyncTimeout$1.write(AsyncTimeout.java:180)
W/System.err:     at okio.RealBufferedSink.flush(RealBufferedSink.java:224)
W/System.err:     at okhttp3.internal.http1.Http1ExchangeCodec.finishRequest(Http1ExchangeCodec.java:190)
W/System.err:     at okhttp3.internal.connection.Exchange.finishRequest(Exchange.java:101)
W/System.err:     at okhttp3.internal.http.CallServerInterceptor.intercept(CallServerInterceptor.java:86)
W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
W/System.err:     at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:43)
W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117)
W/System.err:     at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:94)
W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117)
W/System.err:     at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
W/System.err:     at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:88)
W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117)
W/System.err:     at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:229)
W/System.err:     at okhttp3.RealCall$AsyncCall.execute(RealCall.java:172)
W/System.err:     at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
W/System.err:     at java.lang.Thread.run(Thread.java:923)

*Edit: LoginDataSource class, login():

public void login(String email, String password, ActionCallback callback) {
        try {
            WebInterface webInterface = RetrofitClient.getInstance().getWebInterface();
            Call<Session> call = webInterface.login(new LoggedInUser(email, password));

            call.enqueue(new Callback<>() {
                @Override
                public void onResponse(Call<Session> call, Response<Session> response) {
                    if (response.isSuccessful()) {
                        callback.onActionSuccess(new Result.Success(response.body()));
                    } else {
                        Log.e(TAG, response.message());
                        callback.onActionFailure(new Result.Error(new Exception(response.message())));
                    }
                }

                @Override
                public void onFailure(Call<Session> call, Throwable t) {
                    Log.e(TAG + "onFailure", t.toString());
                    Log.e(TAG, t.getMessage());
                    t.printStackTrace();
                    //callback.onActionFailure(new Result.Error(new Exception(t)));
                }
            });
        } catch (Exception e) {
            callback.onActionFailure(new Result.Error(e));
        }
    }

RetrofitClient class

package depauw.datle.eshop.data;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class RetrofitClient
{
    // Single object reference
    private static RetrofitClient myInstance;
    private Retrofit retrofit;
    private WebInterface webInterface;

    public static RetrofitClient getInstance(){
        if(myInstance == null){
            myInstance = new RetrofitClient();
        }
        return myInstance;
    }

    private RetrofitClient(){
        Gson gson = new GsonBuilder()
                .setLenient()
                .create();
        retrofit = new Retrofit.Builder()
                .baseUrl("http://10.0.2.2:8000/api/v1/")
                .addConverterFactory(GsonConverterFactory.create(gson))
                .client(getUnsafeOkHttpClient().build())
                .build();
        webInterface = retrofit.create(WebInterface.class);
    }

    public WebInterface getWebInterface(){
        return webInterface;
    }

    public static OkHttpClient.Builder getUnsafeOkHttpClient() {
        try {
            // Create a trust manager that does not validate certificate chains
            final TrustManager[] trustAllCerts = new TrustManager[]{
                new X509TrustManager() {
                    @Override
                    public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {
                    }

                    @Override
                    public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) {
                    }

                    @Override
                    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                        return new java.security.cert.X509Certificate[]{};
                    }
                }
            };

            // Install the all-trusting trust manager
            final SSLContext sslContext = SSLContext.getInstance("SSL");
            sslContext.init(null, trustAllCerts, new java.security.SecureRandom());

            // Create an ssl socket factory with our all-trusting manager
            final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

            OkHttpClient.Builder builder = new OkHttpClient.Builder();
            builder.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]);
            builder.hostnameVerifier(new HostnameVerifier() {
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            });
            return builder;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

AndroidManifest.xml, internet permission:

<uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

I think these lines are most relevant, but feel free to let me know which code you need to see.

0

There are 0 best solutions below