zoukankan      html  css  js  c++  java
  • IP查询系统的异步回调案例

     1 package com.lxj.demo;
     2 
     3 import java.io.BufferedReader;
     4 import java.io.IOException;
     5 import java.io.InputStreamReader;
     6 import java.net.MalformedURLException;
     7 import java.net.URL;
     8 
     9 public class Http extends Thread{
    10     // 下载结束的回调接口
    11     public interface IResult{
    12         void success(String msg);
    13         void fail(String msg);
    14     }
    15     // 创建网络地址的引用
    16     String addr;
    17     // 创建回调接口的引用
    18     IResult iResult ;
    19     // 生成构造方法把网络和接口的引用传进去
    20     public Http(String addr, IResult iResult) {
    21         super();
    22         this.addr = addr;
    23         this.iResult = iResult;
    24         // 开启线程  线程一开启就产生了异步
    25         start();
    26     }
    27     @Override
    28     // 重写线程的run方法,只要是网络就要用到多线程
    29     public void run() {
    30         try {
    31             // 创建URL,把网络地址传进去
    32             URL url = new URL(addr);
    33             try {
    34                 // 利用字符缓冲读取流读取网络数据
    35                 BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()));
    36                 // 创建stringbuffer对象
    37                 StringBuffer sb = new StringBuffer();
    38                 // 创建一个临时储存字符串的变量
    39                 String temp;
    40                 // 当temp不为空是就一直读取数据
    41                 while ((temp = br.readLine()) != null) {
    42                     sb.append(temp);
    43                 }
    44                 // 数据读取成功后
    45                 // 把读取的所有数据传到回调接口,再由接口传出去
    46                 iResult.success(sb.toString());
    47             } catch (IOException e) {
    48                 e.printStackTrace();
    49             }
    50         } catch (MalformedURLException e) {
    51             e.printStackTrace();
    52             // 网络请求发生异常
    53             iResult.fail("网络请求失败");
    54         }
    55     }
    56 }
    package com.lxj.demo;
    
    import net.sf.json.JSONObject;
    
    import com.xykj.demo.Http.IResult;
    
    public class IPRequest {
        // 请求IP信息的回调接口,在这里必须要使用回调,因为不知道Http什么时候下载完成
        public interface IRequest{
            void success(IPBean ipBean);
            void fail(String msg);
        }
        // 只要给一个ip地址和回调接口,我们可以通过回调接口传回转化好的ip信息对象
        public void request(String IP,IRequest iRequest){
            // 把用户输入的ip地址拼接到url中,发起Http请求
            String addr ="http://apicloud.mob.com/ip/query?key=520520test&ip="
                    + IP
                    + "";
            new Http(addr, new IResult() {
                // 创建完的IResult success和fail不会马上调用,必须要等到Http下载完成或者发生异常才会调用
                @Override
                public void success(String msg) {
                    // 把接收的json数据转化成IPBean对象
                    JSONObject jsonObject = JSONObject.fromObject(msg);
                    IPBean ipBean = (IPBean) JSONObject.toBean(jsonObject, IPBean.class);
                    // 产生回调,把转化好的对象传递出去给Demo
                    iRequest.success(ipBean);
                }
                
                @Override
                public void fail(String msg) {
                    // Http请求失败的时候
                    iRequest.fail(msg);
                }
            });
        }
    }
    package com.lxj.demo;
    
    public class IPBean {
        public static class Result{
            private String city;
            private String country;
            private String ip;
            private String province;
            public String getCity() {
                return city;
            }
            public void setCity(String city) {
                this.city = city;
            }
            public String getCountry() {
                return country;
            }
            public void setCountry(String country) {
                this.country = country;
            }
            public String getIp() {
                return ip;
            }
            public void setIp(String ip) {
                this.ip = ip;
            }
            public String getProvince() {
                return province;
            }
            public void setProvince(String province) {
                this.province = province;
            }
            @Override
            // 这里必须要重写toString方法,否则将打印的内存里面的地址
            public String toString() {
                return "city:" + city + "
    country:" + country + "
    ip:"
                        + ip + "
    province:" + province;
            }
            
            
        }
        Result result;
        private String msg;
        private String retCode;
        public Result getResult() {
            return result;
        }
        public void setResult(Result result) {
            this.result = result;
        }
        public String getMsg() {
            return msg;
        }
        public void setMsg(String msg) {
            this.msg = msg;
        }
        public String getRetCode() {
            return retCode;
        }
        public void setRetCode(String retCode) {
            this.retCode = retCode;
        }
    }
    package com.lxj.demo;
    
    import java.util.Scanner;
    
    import com.xykj.demo.IPRequest.IRequest;
    
    public class Demo {
        public static void main(String[] args) {
            System.out.println("************欢迎使用IP查询系统************");
            Scanner sc = new Scanner(System.in);
            // 创建IPRequest对象
            IPRequest ipRequest = new IPRequest();
            while (true) {
                System.out.println("请输入要查询的IP:");
                String ip = sc.next();
                // 调用IPRequest里面的request方法
                ipRequest.request(ip, new IRequest() {
                    @Override
                    public void success(IPBean ipBean) {
                        System.out.println("*************查询结果*************");
                        System.out.println(ipBean.getResult());
                    }
                    @Override
                    public void fail(String msg) {
                        System.out.println(msg);
                    }
                });
                
            }
        }
    }
  • 相关阅读:
    u-boot 内核 启动参数
    模块移除 命令rmmod 的实现
    led 的 platform驱动实现
    kconfig语法
    通过编程语言操作数据库
    linux 下 postgres 的使用总结
    maven 项目遇到的问题(不断更新中)
    从svn中check out maven项目 所遇到的一系列问题:
    java多线程学习
    内连接,外连接,交叉连接--数据库查询语句学习
  • 原文地址:https://www.cnblogs.com/lxjhoney/p/6405194.html
Copyright © 2011-2022 走看看