Android java.net.SocketTimeoutException: Connectio

2019-02-20 07:21发布

Recently I have encounter the following error in my program:

11-18 12:30:30.259: W/System.err(21368): java.net.SocketTimeoutException: Connection timed out
11-18 12:30:30.259: W/System.err(21368):    at org.apache.harmony.luni.platform.OSNetworkSystem.connect(Native Method)
11-18 12:30:30.259: W/System.err(21368):    at dalvik.system.BlockGuard$WrappedNetworkSystem.connect(BlockGuard.java:357)
11-18 12:30:30.259: W/System.err(21368):    at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:204)
11-18 12:30:30.259: W/System.err(21368):    at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:437)
11-18 12:30:30.259: W/System.err(21368):    at java.net.Socket.connect(Socket.java:1002)
11-18 12:30:30.259: W/System.err(21368):    at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:75)
11-18 12:30:30.259: W/System.err(21368):    at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:48)
11-18 12:30:30.269: W/System.err(21368):    at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection$Address.connect(HttpConnection.java:322)
11-18 12:30:30.269: W/System.err(21368):    at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionPool.get(HttpConnectionPool.java:89)
11-18 12:30:30.269: W/System.err(21368):    at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getHttpConnection(HttpURLConnectionImpl.java:285)
11-18 12:30:30.269: W/System.err(21368):    at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.makeConnection(HttpURLConnectionImpl.java:267)
11-18 12:30:30.269: W/System.err(21368):    at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:205)
11-18 12:30:30.269: W/System.err(21368):    at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:614)
11-18 12:30:30.269: W/System.err(21368):    at com.example.simplevider.SimpleVideo$4.run(SimpleVideo.java:122)
11-18 12:30:30.279: W/System.err(21368):    at java.lang.Thread.run(Thread.java:1019)

The function that created this error is as follows :

    private void sendStuff() {
    Log.e("sendStuff", "======================================");
    new Thread(new Runnable() {

        @Override
        public void run() {
            final int BUFFER_SIZE = 4096;
            try {
                File uploadFile = new File(existingFileName);
                System.out.println("File to upload: " + existingFileName);
                URL url = new URL(URL);

                HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
                httpConn.setUseCaches(false);
                httpConn.setDoOutput(true);
                httpConn.setRequestMethod("POST");
                httpConn.setReadTimeout(60*1000);
                httpConn.setConnectTimeout(60 * 1000);
                // sets file name as a HTTP header
                httpConn.setRequestProperty("fileName", uploadFile.getName());
                httpConn.setRequestProperty("extra-id", uploadFile.getAbsoluteFile().toString());
                httpConn.setRequestProperty("extra-id2", uploadFile.getParent());
                httpConn.setRequestProperty("extra-id3", uploadFile.length() + "");



                OutputStream outputStream = httpConn.getOutputStream(); //<< this is the source of the error


                FileInputStream inputStream = new FileInputStream(uploadFile);

                byte[] buffer = new byte[BUFFER_SIZE];
                int bytesRead = -1;

                System.out.println("Start writing data...");

                while ((bytesRead = inputStream.read(buffer)) != -1) {
                    outputStream.write(buffer, 0, bytesRead);
                }

                System.out.println("Data was written.");
                outputStream.close();
                inputStream.close();

                // always check HTTP response code from server
                int responseCode = httpConn.getResponseCode();
                if (responseCode == HttpURLConnection.HTTP_OK) {
                    // reads server's response
                    BufferedReader reader = new BufferedReader(new InputStreamReader(httpConn.getInputStream()));
                    String response = reader.readLine();
                    System.out.println("Server's response: " + response);
                } else {
                    System.out.println("Server returned non-OK code: " + responseCode);
                }

            } catch (Exception e) {
                e.printStackTrace();
                sendStuff();
            }

        }
    }).start();

}

This function is perfectly working in normal JAVA but when copied to Android it casts java.net.SocketTimeoutException: Connection timed out and I don't know why.

3条回答
Ridiculous、
2楼-- · 2019-02-20 07:56

this type of exception can also occur if firewall blocks the http or https service and to unblock that goto

firewall->advanced settings -> and check the http or https options and saveenter image description here

查看更多
淡お忘
3楼-- · 2019-02-20 07:59

You can use these code snippet for exception haldling:

HttpURLConnection urlConnection = (HttpURLConnection) callUrl.openConnection();
urlConnection.setReadTimeout(30000);
urlConnection.setConnectTimeout(30000);
查看更多
戒情不戒烟
4楼-- · 2019-02-20 08:11

There are two possibilities,

1)have you checked and tested your connection.

2)better don't set any connection timeout,if you are setting chose maximum time,,bcos it throws an error,if server didn't response within given time..

查看更多
登录 后发表回答