IP查询系统的异步回调案例

 更新时间:2017年02月16日 14:29:33   作者:沁宇   我要评论
本文主要分享了IP查询系统的异步回调案例,具有很好的参考价值,下面跟着小编一起来看下吧

话不多说,请看代码:

package com.lxj.demo;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
public class Http extends Thread{
  // 下载结束的回调接口
  public interface IResult{
    void success(String msg);
    void fail(String msg);
  }
  // 创建网络地址的引用
  String addr;
  // 创建回调接口的引用
  IResult iResult ;
  // 生成构造方法把网络和接口的引用传进去
  public Http(String addr, IResult iResult) {
    super();
    this.addr = addr;
    this.iResult = iResult;
    // 开启线程 线程一开启就产生了异步
    start();
  }
  @Override
  // 重写线程的run方法,只要是网络就要用到多线程
  public void run() {
    try {
      // 创建URL,把网络地址传进去
      URL url = new URL(addr);
      try {
        // 利用字符缓冲读取流读取网络数据
        BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()));
        // 创建stringbuffer对象
        StringBuffer sb = new StringBuffer();
        // 创建一个临时储存字符串的变量
        String temp;
        // 当temp不为空是就一直读取数据
        while ((temp = br.readLine()) != null) {
          sb.append(temp);
        }
        // 数据读取成功后
        // 把读取的所有数据传到回调接口,再由接口传出去
        iResult.success(sb.toString());
      } catch (IOException e) {
        e.printStackTrace();
      }
    } catch (MalformedURLException e) {
      e.printStackTrace();
      // 网络请求发生异常
      iResult.fail("网络请求失败");
    }
  }
}
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 + "\ncountry:" + country + "\nip:"
          + ip + "\nprovince:" + 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);
        }
      });
    }
  }
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持脚本之家!

相关文章

  • volatile可见性的一些认识和论证

    volatile可见性的一些认识和论证

    volatile的关键词的使用在JVM内存模型中已是老生常谈了,这篇文章主要结合自己对可见性的一些认识和一些直观的例子来谈谈volatile,感兴趣的朋友一起看看吧
    2017-08-08
  • java编程abstract类和方法详解

    java编程abstract类和方法详解

    这篇文章主要介绍了java编程abstract类和方法详解,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • Java的Hibernate框架中的基本映射用法讲解

    Java的Hibernate框架中的基本映射用法讲解

    映射是Hibernate框架操作数据库数据的重要特性之一,这里我们来看一下Java的Hibernate框架中的基本映射用法讲解,包括最基本的单向一对一与多对一映射关系等:
    2016-07-07
  • Maven+oracle+SSM搭建简单项目的方法

    Maven+oracle+SSM搭建简单项目的方法

    本篇文章主要介绍了Maven+oracle+SSM搭建简单项目的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • java8中lamba表达式的使用

    java8中lamba表达式的使用

    这篇文章主要介绍了java8中lamba表达式的使用,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-02-02
  • Spring Bean常用的的装配方式详解

    Spring Bean常用的的装配方式详解

    这篇文章主要介绍了Spring Bean常用的的装配方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • 使用java实现http多线程断点下载文件(二)

    使用java实现http多线程断点下载文件(二)

    下载工具我想没有几个人不会用的吧,前段时间比较无聊,花了点时间用java写了个简单的http多线程下载程序,我实现的这个http下载工具功能很简单,就是一个多线程以及一个断点恢复,当然下载是必不可少的,需要的朋友可以参考下
    2012-12-12
  • Struts2中validate数据校验的两种方法详解附Struts2常用校验器

    Struts2中validate数据校验的两种方法详解附Struts2常用校验器

    这篇文章主要介绍了Struts2中validate数据校验的两种方法及Struts2常用校验器,本文介绍的非常详细,具有参考借鉴价值,感兴趣的朋友一起看看吧
    2016-09-09
  • Kryo序列化及反序列化用法示例

    Kryo序列化及反序列化用法示例

    这篇文章主要介绍了Kryo序列化及反序列化用法示例,小编觉得挺不错的,这里分享给大家,需要的朋友可以参考下。
    2017-10-10
  • SpringBoot整合MyBatis-Plus3.1教程详解

    SpringBoot整合MyBatis-Plus3.1教程详解

    这篇文章主要介绍了SpringBoot整合MyBatis-Plus3.1详细教程,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08

最新评论