簡體   English   中英

Android http 連接被拒絕

[英]Android http connection refused

我創建了一個帶有服務和活動的 Android 測試程序。 在活動中,我開始粘性服務。 服務每 10 秒發出一次 http 請求。 如果我不退出活動,一切正常。 如果我退出,服務有時會工作,然后被系統殺死並重新啟動。 重啟后有時http請求有效,有時會給出錯誤信息:

09-28 14:55:18.053 31161-31184/home.xmpp W/System.err: java.net.ConnectException: failed to connect to www.ya.ru/87.250.250.242 (port 80) after 15000ms: isConnected failed: ECONNREFUSED (Connection refused)
09-28 14:55:18.053 31161-31184/home.xmpp W/System.err:     at libcore.io.IoBridge.isConnected(IoBridge.java:238)
09-28 14:55:18.053 31161-31184/home.xmpp W/System.err:     at libcore.io.IoBridge.connectErrno(IoBridge.java:171)
09-28 14:55:18.053 31161-31184/home.xmpp W/System.err:     at libcore.io.IoBridge.connect(IoBridge.java:122)
09-28 14:55:18.053 31161-31184/home.xmpp W/System.err:     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
09-28 14:55:18.053 31161-31184/home.xmpp W/System.err:     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:456)
09-28 14:55:18.053 31161-31184/home.xmpp W/System.err:     at java.net.Socket.connect(Socket.java:882)
09-28 14:55:18.053 31161-31184/home.xmpp W/System.err:     at com.android.okhttp.internal.Platform.connectSocket(Platform.java:174)
09-28 14:55:18.053 31161-31184/home.xmpp W/System.err:     at com.android.okhttp.Connection.connect(Connection.java:152)
09-28 14:55:18.053 31161-31184/home.xmpp W/System.err:     at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:276)
09-28 14:55:18.053 31161-31184/home.xmpp W/System.err:     at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211)
09-28 14:55:18.053 31161-31184/home.xmpp W/System.err:     at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:382)
09-28 14:55:18.053 31161-31184/home.xmpp W/System.err:     at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:106)
09-28 14:55:18.053 31161-31184/home.xmpp W/System.err:     at com.android.okhttp.internal.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:217)
09-28 14:55:18.053 31161-31184/home.xmpp W/System.err:     at home.xmpp.MyService.sendPostRequest(MyService.java:160)
09-28 14:55:18.053 31161-31184/home.xmpp W/System.err:     at home.xmpp.MyService$MyTask.doInBackground(MyService.java:128)
09-28 14:55:18.053 31161-31184/home.xmpp W/System.err:     at home.xmpp.MyService$MyTask.doInBackground(MyService.java:109)
09-28 14:55:18.053 31161-31184/home.xmpp W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:292)
09-28 14:55:18.053 31161-31184/home.xmpp W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
09-28 14:55:18.053 31161-31184/home.xmpp W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
09-28 14:55:18.053 31161-31184/home.xmpp W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
09-28 14:55:18.053 31161-31184/home.xmpp W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
09-28 14:55:18.053 31161-31184/home.xmpp W/System.err:     at java.lang.Thread.run(Thread.java:818)
09-28 14:55:18.053 31161-31184/home.xmpp W/System.err: Caused by: android.system.ErrnoException: isConnected failed: ECONNREFUSED (Connection refused)
09-28 14:55:18.053 31161-31184/home.xmpp W/System.err:     at libcore.io.IoBridge.isConnected(IoBridge.java:223)
09-28 14:55:18.053 31161-31184/home.xmpp W/System.err:  ... 21 more

出現這個錯誤后,下面的請求也會失敗。 我嘗試在另一個進程中啟動服務,嘗試在新的 IntentService 中啟動每個 http 請求,在出現此錯誤后嘗試重新啟動服務,但沒有結果。 如果發生了錯誤,那么其他后續請求也會報錯。 只有應用程序重啟有幫助。 有沒有人遇到過這樣的問題? 如何建立穩定的連接? 我閱讀了很多主題,但沒有找到正確的答案。

我的服務

package home.xmpp;

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.ComponentCallbacks2;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;

import javax.net.ssl.HttpsURLConnection;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

public class MyService extends Service implements ComponentCallbacks2 {
private Boolean disconnectAppeared = false;
static MyService instance;
private Handler mHandler = new Handler();
MyTask mt;
Boolean mtruned = false;


public static MyService getInstance(){
    return instance;
}

@Override
public IBinder onBind(final Intent intent) {
    //throw new UnsupportedOperationException("Not yet implemented");
    return new LocalBinder<MyService>(this);
}

@Override
public void onCreate() {
    super.onCreate();
    instance = this;
    mHandler.postDelayed(timeUpdaterRunnable, 100);
    Log.e("MyService"," created");
}

@Override
public int onStartCommand(final Intent intent, final int flags,
                          final int startId) {
    return Service.START_STICKY;
}

@Override
public boolean onUnbind(final Intent intent) {
    return super.onUnbind(intent);
}

@Override
public void onDestroy() {
    super.onDestroy();
    Log.e("MyService"," destroyed");
    mHandler.removeCallbacks(timeUpdaterRunnable);
}

public void onTrimMemory(int level) {
    switch (level) {
        case ComponentCallbacks2.TRIM_MEMORY_RUNNING_CRITICAL: //Release any memory that your app doesn't need to run.
            //the system will begin killing background processes. !!!
            Log.e("Memory level","4");
            break;
        default:
            break;
    }
}

private Runnable timeUpdaterRunnable = new Runnable() {
    public void run() {
        if (mtruned == false) {
            Log.e("Time", " update");
            mt = new MyTask();
            mt.execute();
            mHandler.postDelayed(this, 10000);
        } else {
            cancelTask();
        }
    }
};

private void cancelTask() {
    if (mt == null) return;
    Log.d("MyService", "cancel result: " + mt.cancel(false));
}


    class MyTask extends AsyncTask<String,Void,String> {
        @Override
        protected void onPreExecute() {
            mtruned = true;
            super.onPreExecute();
        }
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            Log.e("http","updated");
            mtruned = false;
        }
        @Override
        protected String doInBackground(String... params) {
            String result = "";
            HashMap<String,String> data = new HashMap<>();
            data.put("data", "data");
                result = sendPostRequest("http://www.ya.ru", data);
            return result;
        }
        @Override
        protected void onCancelled() {
            super.onCancelled();
            mtruned = false;
        }
}

public String sendPostRequest(String requestURL,
                              HashMap<String, String> postDataParams) {
    //Creating a URL
    URL url;

    //StringBuilder object to store the message retrieved from the server
    StringBuilder sb = new StringBuilder();
    try {
        //Initializing Url
        url = new URL(requestURL);

        //Creating an httmlurl connection
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        //Configuring connection properties
        conn.setReadTimeout(15000);
        conn.setConnectTimeout(15000);
        conn.setRequestMethod("POST");
        conn.setDoInput(true);
        conn.setDoOutput(true);

        //Creating an output stream
        OutputStream os = conn.getOutputStream();

        //Writing parameters to the request
        //We are using a method getPostDataString which is defined below
        BufferedWriter writer = new BufferedWriter(
                new OutputStreamWriter(os, "UTF-8"));
        writer.write(getPostDataString(postDataParams));

        writer.flush();
        writer.close();
        os.close();
        int responseCode = conn.getResponseCode();

        if (responseCode == HttpsURLConnection.HTTP_OK) {

            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            sb = new StringBuilder();
            String response;
            //Reading server response
            while ((response = br.readLine()) != null){
                sb.append(response);
            }
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
    return sb.toString();
}

private String getPostDataString(HashMap<String, String> params) throws UnsupportedEncodingException {
    StringBuilder result = new StringBuilder();
    boolean first = true;
    for (Map.Entry<String, String> entry : params.entrySet()) {
        if (first)
            first = false;
        else
            result.append("&");

        result.append(URLEncoder.encode(entry.getKey(), "UTF-8"));
        result.append("=");
        result.append(URLEncoder.encode(entry.getValue(), "UTF-8"));
    }

    return result.toString();
}


}

17 年 10 月 5 日更新我仍然沒有找到解決方案。 我在 Android 4.1.2 上測試了這個程序。 它工作正常。 在 Android 5.1.1 上,它在退出活動后大約 3 分鍾工作,然后我收到連接被拒絕的錯誤。 當我返回活動時,錯誤消失。 在 Android 6.0.1 上情況類似,但錯誤略有不同 java.net.SocketTimeoutException: failed to connect to /94.130.25.242 (port 80) after 10000ms。 我認為系統會在一段時間后阻止服務中的網絡活動,但不會阻止活動(?)。

17 年 10 月 5 日更新我注意到連接不僅在服務重啟后消失,而且在 2-3 分鍾后退出活動時也會消失。 當我恢復活動時,連接恢復。 我做了一個視頻鏈接更新 06.10.17 一位安卓專家告訴我,這個問題只出現在小米手機上。 幾分鍾后 MIUI 拒絕網絡連接。 只有 OkHttp 有幫助。 我會嘗試,並會在這里提供反饋。

“連接失敗:ECONNREFUSED(連接被拒絕)”很可能意味着在該端口和該 IP 地址上沒有偵聽任何內容。 可能的解釋包括:

  • 該服務已崩潰或尚未啟動,
  • 您的客戶端正在嘗試使用錯誤的 IP 地址或端口進行連接,或者
  • 服務器訪問被代表服務器/服務“拒絕”的防火牆阻止。 鑒於正常做法(這些天)是防火牆“黑洞”所有不需要的連接嘗試,因此這不太可能。

小米手機無法在后台使用長網絡連接。 一段時間后,MIUI 會阻止任何網絡連接。 對於關鍵的網絡連接,您可以使用 Firebase Cloud Messaging,它在 Android 系統中具有高優先級。 它可以啟動必要的后台工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM