Android java.net.SocketTimeoutException:连接超时

最近我在我的程序中遇到以下错误:

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.(HttpConnection.java:75) 11-18 12:30:30.259: W/System.err(21368): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.(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) 

创建此错误的函数如下:

  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(); } 

这个函数在普通的JAVA中完美地工作,但是当复制到Android时它会转换java.net.SocketTimeoutException: Connection timed out ,我不知道为什么。

有两种可能性,

1)您检查并测试了您的连接。

2)最好不设置任何连接超时,如果你设置选择最大时间,bcos它会抛出一个错误,如果服务器在给定时间内没有响应..

您可以使用这些代码段进行exception处理:

 HttpURLConnection urlConnection = (HttpURLConnection) callUrl.openConnection(); urlConnection.setReadTimeout(30000); urlConnection.setConnectTimeout(30000);