java socket 模拟http请求问题


public class CheckDetailService {
    private static Logger logger = Logger.getLogger(CheckDetailTest.class);
    //任务队列
    private List<WorkTask> taskList = new ArrayList<WorkTask>();
   
    public CheckDetailService(){

        initTaskList();
    }
   
    public void initTaskList(){
        List<Domain> list = new DomainDaoImpl().getDomains();

        for(Domain domain : list){

        //往任务队列里添加任务

            taskList.add(new WorkTask(domain));
        }
    }
   
    public List<Future<CheckDetail>> execute(){

        List<Future<CheckDetail>> futureList = new ArrayList<Future<CheckDetail>>();

        //jdk自带线程池,分配10个线程

        ExecutorService service = Executors.newFixedThreadPool(10);

        try {

        //线程池中多线程执行tasklist任务队列,执行时间为5分钟,5分钟执行不完就中断执行

            futureList = service.invokeAll(taskList,5,TimeUnit.MINUTES);
        } catch (InterruptedException e) {
            logger.error("正在执行的任务意外中断.",e);
        }finally{
            service.shutdown();
        }
        return futureList;
    }
    //每一个任务
    class WorkTask implements Callable<CheckDetail>{
        private Domain domain;
       
        public WorkTask(Domain domain){
            this.domain = domain;
        }
        public CheckDetail call(){
            int stateCode = 0;
            int state = 1;
            StringBuilder header = new StringBuilder();
            BufferedReader br = null;
            BufferedWriter bw = null;
            StringBuilder accept = new StringBuilder("GET / HTTP/1.1\r\n");
            accept.append("User-Agent: Java/1.6.0_20\r\n");
            accept.append("Host: "+domain.getDomainname()+":"+domain.getPort()+"\r\n");
            accept.append("Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2\r\n");
            accept.append("Connection: Close\r\n");
            accept.append("\r\n");
            try {

                Socket socket = new Socket();

                //socekt连接ip,port,5秒钟后没有连接指定ip则跑出SocketTimeOutException异常,表示连接超时

                socket.connect(new InetSocketAddress(InetAddress.getByName(domain.getIp()), domain.getPort()),5);
                socket.setSoTimeout(5);
                br = new BufferedReader(new InputStreamReader(socket.getInputStream(),"GBK"));
                bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                bw.write(accept.toString());
                bw.flush();
                String firstLine = br.readLine();
                if(firstLine != null){
                    stateCode = Integer.parseInt(firstLine.split(" ")[1]);
                    header.append(firstLine);
                }
                state = (stateCode == 200)? 1 : 2;
                String line = "";
                while(!"".equals((line = br.readLine()))){
                    header.append(line+"\n");
                }
            } catch (Exception e) {
                if(e instanceof SocketTimeoutException){
                    state = 3;
                    logger.info("检查域名:"+domain.getDomainname()+":"+domain.getPort()+" 连接超时.");
                }else{
                    state = 2;
                    logger.info("检查域名:"+domain.getDomainname()+":"+domain.getPort()+" 失败.");
                }
            }finally{
                try {
                    if(bw != null)
                    bw.close();
                    if(br != null)
                    br.close();
                } catch (IOException e) {
                    logger.error("关闭输入输出流失败.",e);
                }
            }
            CheckDetail cDetail = new CheckDetail();
            cDetail.setCheckDate(new Date());
            cDetail.setCheckStatus(state);
            cDetail.setStatusCode(stateCode);
            cDetail.setHeader(header.toString());
            cDetail.setDomain(domain.getDomainname());
            cDetail.setIp(domain.getIp());
            cDetail.setPort(domain.getPort());
            return cDetail;
        }
    }
}

转载于:https://my.oschina.net/aicoding/blog/67570

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值