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);
}
}); }
}
}

IP查询系统的异步回调案例的更多相关文章

  1. ArcGIS中使用异步回调函数查询图层Graphic

    在我们的地图的操作中经常会有一些操作是需要通过画多边形或者画线来查找某一块区域内的特定的Graphics比如我们在做的交警的项目中通过框选来查找某一块区域中的摄像机,某一块区域中的警力.警情.警员等相 ...

  2. Python 小案例实战 —— 简易银行存取款查询系统

    Python 小案例实战 -- 简易银行存取款查询系统 涉及知识点 包的调用 字典.列表的混合运用 列表元素索引.追加 基本的循环与分支结构 源码 import sys import time ban ...

  3. 二维码生成与windows系统IP查询功能

    一个木函是一款强大的手机软件,里面囊括了很多小功能,每一个都基本可以堪称小程序.那么,这些小功能具体是怎么实现的呢?让我们来一起来探讨二维码生成.IP查询这两个功能吧! 一.二维码生成 首先,我们来看 ...

  4. 支付回调地址 同步回调地址 异步回调地址 return_url和notify_url的区别

    [微信支付]JSAPI支付开发者文档 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_16&index=10 退款结果通知 ...

  5. 【云图】如何制作全国KTV查询系统?

    原文:[云图]如何制作全国KTV查询系统? 摘要:本文以[唱吧]531麦霸音乐节为案例,详细解读了如何导入自有数据到高德云图,并进行检索和展示.最后,调起高德mobile地图来进行路线规划和周边查询. ...

  6. 通知url必须为直接可访问的url,不能携带参数 异步接收微信支付结果通知的回调地址 不能携带参数。 回调地址后是否可以加自定义参数 同步回调地址 异步回调地址 return_url和notify_url的区别

    [微信支付]微信小程序支付开发者文档 https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_7 通知url必须为直接可访问的 ...

  7. Future 异步回调 大起底之 Java Future 与 Guava Future

    目录 写在前面 1. Future模式异步回调大起底 1.1. 从泡茶的案例说起 1.2. 何为异步回调 1.2.1. 同步.异步.阻塞.非阻塞 1.2.2. 阻塞模式的泡茶案例图解 1.2.3. 回 ...

  8. GIL全局解释器锁,线程池与进程池 同步异步,阻塞与非阻塞,异步回调

    GIL全局解释器锁 1.什么是GIL 官方解释:'''In CPython, the global interpreter lock, or GIL, is a mutex that prevents ...

  9. State Threads——异步回调的线性实现

    State Threads——异步回调的线性实现 原文链接:http://coolshell.cn/articles/12012.html 本文的标题看起来有点拗口,其实State Threads库就 ...

随机推荐

  1. jconsole工具检测堆内存变化的使用

    jconsole将Java写的程序检测. 从Java 5开始 引入了 JConsole.JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行.您可以轻松地使 ...

  2. Oracle的db.properties文件

    转自:https://blog.csdn.net/lssqk/article/details/79133829

  3. Dockerfile-HEALTHCHECK指令

    Dockerfile中使用HEALTHCHECK的形式有两种: 1.HEALTHCHECK [options] CMD command 2.HEALTHCHECK NODE 意思是禁止从父镜像继承的H ...

  4. linux中目录操作<1>

    一.目录的权限 (1)目录文件的访问权限分为三组,分别为所有者,用户,其他.每个权限组的权限位有3个,分别为读.写.执行. 注意:可以使用stat函数得到目录文件的状态信息.权限为在stat结构中st ...

  5. python __builtins__ str类 (65)

    65.'str', 字节转换成字符串.第一个传入参数是要转换的字节,第二个参数是按什么编码转换成字符串 class str(object) | str(object='') -> str | s ...

  6. CF788B Weird journey

    总共有n个节点,m条路径,要求其中m-2条路径走两遍,剩下2条路径仅走一遍,问不同的路径总数有多少,如果仅走一遍的两条边不同则将这两条路径视为不同. 可以把每条边都拆成两条重边,每条边的度数都是偶数了 ...

  7. 洛谷P2585 [ZJOI2006]三色二叉树(树形dp)

    传送门 设$dp[u][i]$表示点$u$颜色为$i$时最多(最少)的绿点个数(这里用$0$表示绿点) 然后直接用树形dp就可以了 记得把情况讨论清楚 //minamoto #include<b ...

  8. C#大话设计模式学习总结

    如有雷同,不胜荣欣,如转载,请注明 C#大话设计模式学习总结 一.工厂模式 面向对象的三个特性:封装,继承和多态 1.封装 Class Operate { privatedouble _numberA ...

  9. github最值得收藏的Bootstrap3后台管理框架

    1. AdminLTE AdminLTE是一个完全响应的后台管理模板.基于Bootstrap3框架.高度可定制,易于使用.适合许多屏幕分辨率从小型移动设备到大型台式机. GitHub AdminLTE ...

  10. 多线程 synchronized锁定当前对象

    synchronized(this) 和synchronized一样,都是锁定当前对象. public class Task { synchronized public void otherMetho ...