HttpURLConnection.getInputStream()抛出SocketTimeoutException

时间:2015-06-01 08:54:48

标签: java android httpurlconnection urlconnection socket-timeout-exception

我正在使用HttpURLConnection上传图片并获得回复 它适用于模拟器和我的小米设备 但是,它总是在我的Sony设备上SocketTimeoutExceptionconnection.getInputStream()。{ 我试图将超时设置为大值,例如1分钟但不起作用。

 public String uploadFile(File file, String requestURL) {

        if (file != null) {
            long fileSize = file.length();
            HttpURLConnection.setFollowRedirects(false);
            HttpURLConnection connection = null;
            try {
                //config of connection
                connection = (HttpURLConnection) new URL(requestURL).openConnection();
                connection.setConnectTimeout(10000);
                connection.setReadTimeout(10000);
                connection.setRequestMethod("PUT");
                connection.setRequestProperty("Content-Type", "image/jpeg");
                connection.setDoOutput(true);
                connection.setRequestProperty("Content-length", "" + fileSize);
                connection.connect();

                //upload file
                DataOutputStream out = new DataOutputStream(connection.getOutputStream());
                int bytesRead;
                byte buf[] = new byte[1024];
                BufferedInputStream bufInput = new BufferedInputStream(new FileInputStream(file));
                while ((bytesRead = bufInput.read(buf)) != -1) {
                    out.write(buf, 0, bytesRead);
                    out.flush();
                }
                out.flush();
                out.close();

                //get response message, but SocketTimeoutException occurs here
                BufferedReader br = new BufferedReader(new InputStreamReader((connection.getInputStream())));
                StringBuilder sb = new StringBuilder();
                String output;
                while ((output = br.readLine()) != null) {
                    sb.append(output);
                }

                //return response message
                return output;

            } catch (Exception e) {
                // Exception
                e.printStackTrace();
            } finally {
                if (connection != null) connection.disconnect();
            }
        }

        return null;
    }

导致此问题的原因是什么?如何解决?

其他信息: 我在相同的wifi连接下测试了设备。确保网络和文件服务器正常工作。测试图像的文件大小约为100~200kbyte。

2 个答案:

答案 0 :(得分:0)

因为您将读取超时设置为10秒,并且在10秒内未收到任何响应。

这是一个棘手的问题吗?

注意:您不需要设置内容长度标头。 Java会为你做到这一点。

答案 1 :(得分:0)

只需删除connection.setReadTimeout()语句,因为默认情况下它会将readTiomeout值设置为0,即它将等待数据直到数据可用。因此,您可能无法获得SocketTimeOut异常。