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);
}
});
}
}
}
IP查询系统的异步回调案例的更多相关文章
- ArcGIS中使用异步回调函数查询图层Graphic
在我们的地图的操作中经常会有一些操作是需要通过画多边形或者画线来查找某一块区域内的特定的Graphics比如我们在做的交警的项目中通过框选来查找某一块区域中的摄像机,某一块区域中的警力.警情.警员等相 ...
- Python 小案例实战 —— 简易银行存取款查询系统
Python 小案例实战 -- 简易银行存取款查询系统 涉及知识点 包的调用 字典.列表的混合运用 列表元素索引.追加 基本的循环与分支结构 源码 import sys import time ban ...
- 二维码生成与windows系统IP查询功能
一个木函是一款强大的手机软件,里面囊括了很多小功能,每一个都基本可以堪称小程序.那么,这些小功能具体是怎么实现的呢?让我们来一起来探讨二维码生成.IP查询这两个功能吧! 一.二维码生成 首先,我们来看 ...
- 支付回调地址 同步回调地址 异步回调地址 return_url和notify_url的区别
[微信支付]JSAPI支付开发者文档 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_16&index=10 退款结果通知 ...
- 【云图】如何制作全国KTV查询系统?
原文:[云图]如何制作全国KTV查询系统? 摘要:本文以[唱吧]531麦霸音乐节为案例,详细解读了如何导入自有数据到高德云图,并进行检索和展示.最后,调起高德mobile地图来进行路线规划和周边查询. ...
- 通知url必须为直接可访问的url,不能携带参数 异步接收微信支付结果通知的回调地址 不能携带参数。 回调地址后是否可以加自定义参数 同步回调地址 异步回调地址 return_url和notify_url的区别
[微信支付]微信小程序支付开发者文档 https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_7 通知url必须为直接可访问的 ...
- Future 异步回调 大起底之 Java Future 与 Guava Future
目录 写在前面 1. Future模式异步回调大起底 1.1. 从泡茶的案例说起 1.2. 何为异步回调 1.2.1. 同步.异步.阻塞.非阻塞 1.2.2. 阻塞模式的泡茶案例图解 1.2.3. 回 ...
- GIL全局解释器锁,线程池与进程池 同步异步,阻塞与非阻塞,异步回调
GIL全局解释器锁 1.什么是GIL 官方解释:'''In CPython, the global interpreter lock, or GIL, is a mutex that prevents ...
- State Threads——异步回调的线性实现
State Threads——异步回调的线性实现 原文链接:http://coolshell.cn/articles/12012.html 本文的标题看起来有点拗口,其实State Threads库就 ...
随机推荐
- codeforces 433C. Ryouko's Memory Note 解题报告
题目链接:http://codeforces.com/problemset/problem/433/C 题目意思:一本书有 n 页,每页的编号依次从 1 到 n 编排.如果从页 x 翻到页 y,那么| ...
- [原创]java获取word文档的条目化内容
在开发Web办公系统或文档系统时,PageOffice组件是众所周知的在线处理微软word/ppt/excel文档的强大工具,它对WORD文档的各种处理在API层面进行了封装,屏蔽了Office VB ...
- 出现Insufficient space for shared memory file错误解决
今天在linux下敲命令,出现上面的错误,原来是临时文件目录(/tmp)下的空间不够了,df一看/下100%了.
- 微信小程序服务类目大坑:特殊行业服务类目所需资质材料
作为一个技术开发人员,遇到特殊行业服务类目所需资质材料,只能叫苦连天了,妈的,这个不是技术可以解决的问题,如果技术可以解决的问题都不是问题. 百牛信息技术bainiu.ltd整理发布于博客园 特殊行业 ...
- iphone 在设置了initial-scale=1 之后,在设置滚动条之后,没有滑动效果的解决办法
iphone在设置了initial-scale=1 之后,我们终于可以以1:1 的比例进行页面设计了. 关于viewport,还有一个很重要的概念是:iphone 的safari 浏览器完全没有滚动条 ...
- DebugView 使用
最近遇到带加密狗的工程项目,无法使用控制台调试,尝试使用DebugView进行辅助调试. DebugView是一个系统调试信息输出的捕获工具,可以捕获程序中由TRACE(debug版本)和Output ...
- POJ 3419 Difference Is Beautiful (DP + 二分 + rmq)
题意:给n个数(n<=200000),每个数的绝对值不超过(10^6),有m个查询(m<=200000),每次查询区间[a,b]中连续的没有相同数的的最大长度. 析:由于n太大,无法暴力, ...
- HDU 1270 小希的数表 (暴力枚举+数学)
题意:... 析:我们可以知道,a1+a2=b1,那么我们可以枚举a1,那么a2就有了,并且a1+a3=b2,所以a3就有了,我们再从把里面的剩下的数两两相加,并从b数组中去掉, 那么剩下的最小的就是 ...
- liteos 中断机制(四)
1. 概述 中断是指出现需要时, CPU暂停执行当前程序,转而执行新程序的过程.即在程序运行过程中,系统出现了一个必须由CPU立即处理的事务,此时, CPU暂时中止当前程序的执行转而处理这个事务,这个 ...
- 模板 - 字符串 - Manacher
求最长回文子串. #include<bits/stdc++.h> using namespace std; #define ll long long ; ]; ]; int Manache ...