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.