关于java 使用HttpURLConnection 发送get请求下载文件的问题,线程总是会卡在SocketInputStream.read 这儿

newsomeone 发布于 09/10 16:11
阅读 201
收藏 0

有两台电脑,说下环境

两台电脑都在一个局域网内,网络环境应该都是一样的

A电脑:win7 jdk1.8.0_221   ip:192.168.1.113

B电脑:win10 jdk1.8.0_221  ip:192.168.1.115

B电脑里面我又装了一个linux虚拟机测试,网络连接是用的NAT模式,这台称为B1

 

一样的代码:就是很普通的 get下载文件,apache的httpClient效果也是一样的,代码就不贴出来了

HttpReqUtil.class
package com.test.http;

import org.apache.log4j.Logger;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpReqUtil {

    private final static Logger log = Logger.getLogger(HttpUtil.class);


    public static void downloadByGet(String remoteUrl, String localPath) {
        HttpURLConnection con = null;
        InputStream inputStream = null;
        FileOutputStream fileOutputStream = null;
        try {
            URL url = new URL(remoteUrl);
            con = (HttpURLConnection) url.openConnection();
            con.setRequestMethod("GET");
            con.setConnectTimeout(10000);
            con.setReadTimeout(10000);
            con.connect();
            int responseCode = con.getResponseCode();
            if (responseCode == 200) {
                inputStream = con.getInputStream();
                byte[] bytes = new byte[1024];
                int i = 0;
                fileOutputStream = new FileOutputStream(localPath);
                while ((i = inputStream.read(bytes)) != -1) {
                    fileOutputStream.write(bytes, 0, i);
                    fileOutputStream.flush();
                }
                log.info("download file success");
            } else {
                log.error("download file error,status code:" + responseCode);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (inputStream != null) {
                    inputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (fileOutputStream != null) {
                    fileOutputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (con != null) {
                con.disconnect();
            }
        }
    }
}

然后执行

downloadByGet("https://www.baidu.com/", "D:\\down\\test.file");

A,B1都可以正常执行,B总是会报超时,如果代码里面不设置超时时间,它就会一直卡在

SocketInputStream.read() 这个native方法这儿

继续:

B电脑上开一个本地的tomcat,试试能不能下载本地文件

downloadByGet("http://localhost:8080/docs/index.html","D:\\down\\test.file");

结果一样

A电脑正常的下载这个也是完全没有问题

downloadByGet("http://192.168.1.115:8080/docs/index.html","D:\\down\\test.file");

 

我这样测试不知道是否排除了网络的影响,下载本地的文件,内部虚拟机可以执行 这两个因素

反正不管怎么执行,B电脑就是会卡在SocketInputStream.read()这个方法上,想问问有人遇到过这样的问题吗?

有没有什么解决或则调试思路给点意见,万分感谢~

 

加载中
返回顶部
顶部