2016-11-17 12 views
8

मैं अपने आवेदन में से एक के लिए ओखेट और रेट्रोफिट का उपयोग कर रहा हूं और मेरे पास आरएक्सजेवा का उपयोग करके विभिन्न धागे पर काम करने का कई अनुरोध है। कभी-कभी मुझे किसी भी अनुरोध पर सॉकेटएक्सप्शन मिला और बाद में सर्वर पर कोई अनुरोध नहीं पहुंच सकता।HTTP FAILED का कारण क्या है: java.net.SocketException: सॉकेट बंद है?

उदा। मैं एक नमूना साझा कर सकता हूं।

कोड से कुछ संशोधित स्निपेट साझा कर सकते हैं।

Subscription details = api.details("keyword") 
       .subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(new Subscriber<Model>() { 
        @Override 
        public void onCompleted() { 
         Timber.d("onCompleted(): "); 
        } 

        @Override 
        public void onError(Throwable e) { 
         Timber.e(e, "onError(): "); 
        } 

        @Override 
        public void onNext(final Model details) { 
         Timber.d("onNext(): "); 
        } 
       }); 

सभी 3 कॉलबैक से कुछ भी नहीं कहा जाता है।

Stackstace:

11-17 15:50:53.991 16595-10314/ D/OkHttp: --> GET API_REQUEST_URL 
11-17 15:50:53.991 16595-10314/ D/OkHttp: Host: HOST_NAME 
11-17 15:50:53.991 16595-10314/ D/OkHttp: Connection: Keep-Alive 
11-17 15:50:53.991 16595-10314/ D/OkHttp: Accept-Encoding: gzip 
11-17 15:50:53.991 16595-10314/ D/OkHttp: User-Agent: okhttp/3.4.2 
11-17 15:50:53.991 16595-10314/ D/OkHttp: User-Agent: Android-App 
11-17 15:50:53.991 16595-10314/ D/OkHttp: --> END GET 
11-17 15:50:53.992 16595-10314/ D/OkHttp: <-- HTTP FAILED: java.net.SocketException: Socket closed 

अन्य IOException

11-17 16:36:04.274 28523-29137/ D/OkHttp: Host: HOST_NAME 
11-17 16:36:04.274 28523-29137/ D/OkHttp: Connection: Keep-Alive 
11-17 16:36:04.274 28523-29137/ D/OkHttp: Accept-Encoding: gzip 
11-17 16:36:04.274 28523-29137/ D/OkHttp: User-Agent: okhttp/3.4.2 
11-17 16:36:04.274 28523-29137/ D/OkHttp: User-Agent: Android-App 
11-17 16:36:04.274 28523-29137/ D/OkHttp: --> END GET 
11-17 16:36:04.282 28523-29137/ D/OkHttp: <-- HTTP FAILED: java.io.IOException: unexpected end of stream on [email protected] 

सदस्यता मैं अक्सर वहाँ ठीक काम कर रहा है लेकिन कभी कभी त्रुटि ऊपर जाता है और फिर कार्य करना बंद कर कॉल करने के लिए कोशिश कर रहा हूँ। अफवर्ड्स कोई अनुरोध सर्वर तक पहुंच सकता है। कुछ भी आवश्यक है, तो पुराना वापस इंटरफ़ेस

@GET("/v1/app_endpoint/{keyword}/") 
Observable<Model> details(@Path("keyword") String keyword); 

सिर्फ जांच विन्यास के लिए कुछ सहायक तरीकों नीचे से

विधि।

public static Retrofit retrofit() { 
    return provideRetrofit(provideGson(), provideOkHttpClient()); 
} 

public static Gson provideGson() { 
    GsonBuilder gsonBuilder = new GsonBuilder(); 
    gsonBuilder.addSerializationExclusionStrategy(new AnnotationExclusionStrategy()); 
    gsonBuilder.addDeserializationExclusionStrategy(new AnnotationExclusionStrategy()); 
    gsonBuilder.setExclusionStrategies(new ExclusionStrategy() { 
     @Override 
     public boolean shouldSkipField(FieldAttributes f) { 
      return f.getDeclaringClass().equals(RealmObject.class); 
     } 

     @Override 
     public boolean shouldSkipClass(Class<?> clazz) { 
      return false; 
     } 
    }); 
    gsonBuilder.registerTypeAdapterFactory(AutoValueGsonTypeAdapterFactory.create()); 
    return gsonBuilder.create(); 
} 

public static OkHttpClient provideOkHttpClient() { 
    return new OkHttpClient.Builder() 
      .connectTimeout(30, TimeUnit.SECONDS) 
      .writeTimeout(600, TimeUnit.SECONDS) 
      .readTimeout(1, TimeUnit.MINUTES) 
      .retryOnConnectionFailure(true) 
      .addNetworkInterceptor(new Interceptor() { 
       @Override 
       public okhttp3.Response intercept(Chain chain) throws IOException { 
        Request newRequest = chain.request().newBuilder() 
          .addHeader("Content-Type", "application/json") 
          .addHeader("User-Agent", "Android-App") 
          .build(); 
        return chain.proceed(newRequest); 
       } 
      }) 
      .addNetworkInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)) 
      .build(); 
} 

public static Retrofit provideRetrofit(Gson gson, OkHttpClient okHttpClient) { 
    return new Retrofit.Builder() 
      .baseUrl(BuildConfig.API_URL) 
      .client(okHttpClient) 
      .addConverterFactory(GsonConverterFactory.create(gson)) 
      .addCallAdapterFactory(RxJavaCallAdapterFactory.createWithScheduler(Schedulers.io())) 
      .build(); 
} 

निर्भरता

// Networking 
compile 'com.squareup.okhttp3:okhttp:3.4.2' 
compile 'com.squareup.retrofit2:retrofit:2.1.0' 
compile 'com.squareup.retrofit2:converter-gson:2.1.0' 
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0' 
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1' 
+0

क्या आपको कभी इस मुद्दे के लिए कोई समाधान मिला है? मैं okhttp 3.5.0/RxJava 2/जैक्सन का उपयोग कर एकाधिक एसिंक्रोनस http अनुरोधों का उपयोग कर समान यादृच्छिक त्रुटि देख रहा हूं। –

+0

मैं कह सकता हूं कि आपको बस अपने सर्वर कनेक्ट/पढ़ने/लिखने के समय के आधार पर टाइमआउट कॉन्फ़िगरेशन के साथ खेलने की आवश्यकता है। –

+0

जब मैं कनेक्शन सेट करता हूं, पढ़ता हूं और लिखता हूं, तो मुझे एक ही समस्या है, इसलिए, मुझे लगता है कि लाइब्रेरी द्वारा सॉकेटएक्सप्शन को संभाला जा रहा है, लेकिन अजीब चीज यह है कि यह किसी भी त्रुटि, पूर्ण, या अगली विधियों तक कभी नहीं पहुंचती है और मेरे मामले में, पर्यवेक्षक कभी खत्म नहीं होता ... किसी भी मदद की सराहना की जाएगी। –

उत्तर

1

मेरे मामले में, क्या मुझे पता चला मैं हो रही थी अचानक अप्रत्याशित unsubscribe() कॉल कि HTTP FAILED: java.net.SocketException: Socket closed त्रुटि पैदा कर रहा था और onCompleted()onError() या onNext() कॉलबैक के किसी भी लागू नहीं था - जांच चर्चा बाहर करें और here उत्तर दें।

तो, उस मामले को संभालने के लिए सक्षम होने के लिए, बस जोड़ें:

.doOnUnsubscribe(() -> { /*handle logic here*/ }) 

अपने Observable करने और हो सकता है कि कुछ राज्य पुनर्स्थापित करने के लिए है, जो उम्मीद है कि एक में सामान्य गतिविधियों को फिर से शुरू करने की क्षमता होगी प्रयास करें।

0

मेरे मामले में मैंने एक गलत यूआरएल त्रुटि ERR_CONNECTION_REFUSED प्राप्त करने का अनुरोध किया।

संबंधित मुद्दे