IP查询系统的异步回调案例
作者:沁宇 发布时间:2023-11-10 18:22:24
标签:异步回调
话不多说,请看代码:
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);
}
});
}
}
}
来源:http://www.cnblogs.com/lxjhoney/p/6405194.html
0
投稿
猜你喜欢
- iText介绍和说明因为项目需要生成PDF文件,所以去找了一下能够生成PDF的Java工具,看到了iText可以说好评如潮。如果你想通过ja
- Java实现PC微信扫码支付做一个电商网站支付功能必不可少,那我们今天就来盘一盘微信支付。微信支付官方网站业务流程:开发指引文档支付服务开发
- 本文实例为大家分享了Android绝对布局AbsoluteLayout的具体代码,供大家参考,具体内容如下1>AbsoluteLayo
- 最近没事写了一个简易浏览器,在刚开始写的时候遇到一些问题,主要的问题就是如何在自己的webview中显示所有的网页数据,不过不指
- 今天下了个新浪微博的API研究研究,目前实现了发布微博功能,包括带图片的微博。为了安全,新浪微博的API中并没有提供用微博帐号密码登录的功能
- 实现功能:模拟简单登录功能,登录成功跳转新页面,登录失败在原登录界面提示登录失败信息开发环境:eclipseTomcat-8.0预备知识:H
- 一、整体设计1、需求分析池化技术是计算机中的一种设计模式,内存池是常见的池化技术之一,它能够有效的提高内存的申请和释放效率以及内存碎片等问题
- 仅供学习交流,禁止商业用途。如侵害利益,联系必删!前言最近一位小伙伴钟爱二次元文化,于是找到半次元这个app,但是很快他就遇到了问题。一、案
- 前言我在以往的文章中曾介绍过如何给Word文档添加文本水印和图片水印,及怎样删除文档中的水印。关于文本水印,之前那篇教程里主要指的是单行字体
- 记录一下微信第三方实现登录的方法。还是比较简单。一、必要的准备工作1.首先需要注册并被审核通过的微信开放平台帐号,然后创建一个移动应用,也需
- 前言我们一说到spring,可能第一个想到的是 IOC(控制反转) 和 AOP(面向切面编程)。没错,它们是spring的基石,得益于它们的
- 最近碰到这么个恶心的问题问题:有个arr文件被放到Module A中引用,现在Module B又依赖了Module A,则在编译过程中会发生
- 第一次进入应用的时候,都会有一个引导页面,引导页面的实现起来也很简单,实现的方式也有很多,下面是自己写的一个引导页面的效果,大致的实现思路为
- mport java.text.DecimalFormat; DecimalFormat &nb
- 一个错误:多线程使用单一消费者下图显现了一种错误的使用KafkaConsumer的方法创建多个线程用来消费kafka数据多线程使用同一个Ka
- Idea2020.2创建JavaWeb的方式略有改动,以下做个记录,大家可以参考下,对以后的工作有所帮助!1.创建项目不再是Java Ent
- 1.申请测试号,并记录appID和appsecret2.关注测试号3.添加消息模板{{topic.DATA}} 用户名: {{user.DA
- Java 方法执行时的动态分派和静态分派是 Java 实现多态的本质背景Java 的动态分派和静态分派也是 Java 方法的执行原理。 Ja
- HashMap的get()方法的NullPointerException今天写代码发现一个 bug,HashMap的 get() 方法一直报
- 正在尝试分配更低的访问权限?在进行Java编程时会给我们报出如下提示怎么办?这里我们将给大家介绍详细的解决方法。首先,查看,控制台给出的提示