IP查詢系統(tǒng)的異步回調(diào)案例
更新時(shí)間:2017年02月16日 14:29:33 作者:沁宇
本文主要分享了IP查詢系統(tǒng)的異步回調(diào)案例,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
話不多說(shuō),請(qǐng)看代碼:
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{
// 下載結(jié)束的回調(diào)接口
public interface IResult{
void success(String msg);
void fail(String msg);
}
// 創(chuàng)建網(wǎng)絡(luò)地址的引用
String addr;
// 創(chuàng)建回調(diào)接口的引用
IResult iResult ;
// 生成構(gòu)造方法把網(wǎng)絡(luò)和接口的引用傳進(jìn)去
public Http(String addr, IResult iResult) {
super();
this.addr = addr;
this.iResult = iResult;
// 開(kāi)啟線程 線程一開(kāi)啟就產(chǎn)生了異步
start();
}
@Override
// 重寫線程的run方法,只要是網(wǎng)絡(luò)就要用到多線程
public void run() {
try {
// 創(chuàng)建URL,把網(wǎng)絡(luò)地址傳進(jìn)去
URL url = new URL(addr);
try {
// 利用字符緩沖讀取流讀取網(wǎng)絡(luò)數(shù)據(jù)
BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()));
// 創(chuàng)建stringbuffer對(duì)象
StringBuffer sb = new StringBuffer();
// 創(chuàng)建一個(gè)臨時(shí)儲(chǔ)存字符串的變量
String temp;
// 當(dāng)temp不為空是就一直讀取數(shù)據(jù)
while ((temp = br.readLine()) != null) {
sb.append(temp);
}
// 數(shù)據(jù)讀取成功后
// 把讀取的所有數(shù)據(jù)傳到回調(diào)接口,再由接口傳出去
iResult.success(sb.toString());
} catch (IOException e) {
e.printStackTrace();
}
} catch (MalformedURLException e) {
e.printStackTrace();
// 網(wǎng)絡(luò)請(qǐng)求發(fā)生異常
iResult.fail("網(wǎng)絡(luò)請(qǐng)求失敗");
}
}
}
package com.lxj.demo;
import net.sf.json.JSONObject;
import com.xykj.demo.Http.IResult;
public class IPRequest {
// 請(qǐng)求IP信息的回調(diào)接口,在這里必須要使用回調(diào),因?yàn)椴恢繦ttp什么時(shí)候下載完成
public interface IRequest{
void success(IPBean ipBean);
void fail(String msg);
}
// 只要給一個(gè)ip地址和回調(diào)接口,我們可以通過(guò)回調(diào)接口傳回轉(zhuǎn)化好的ip信息對(duì)象
public void request(String IP,IRequest iRequest){
// 把用戶輸入的ip地址拼接到url中,發(fā)起Http請(qǐng)求
String addr ="http://apicloud.mob.com/ip/query?key=520520test&ip="
+ IP
+ "";
new Http(addr, new IResult() {
// 創(chuàng)建完的IResult success和fail不會(huì)馬上調(diào)用,必須要等到Http下載完成或者發(fā)生異常才會(huì)調(diào)用
@Override
public void success(String msg) {
// 把接收的json數(shù)據(jù)轉(zhuǎn)化成IPBean對(duì)象
JSONObject jsonObject = JSONObject.fromObject(msg);
IPBean ipBean = (IPBean) JSONObject.toBean(jsonObject, IPBean.class);
// 產(chǎn)生回調(diào),把轉(zhuǎn)化好的對(duì)象傳遞出去給Demo
iRequest.success(ipBean);
}
@Override
public void fail(String msg) {
// Http請(qǐng)求失敗的時(shí)候
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方法,否則將打印的內(nèi)存里面的地址
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查詢系統(tǒng)************");
Scanner sc = new Scanner(System.in);
// 創(chuàng)建IPRequest對(duì)象
IPRequest ipRequest = new IPRequest();
while (true) {
System.out.println("請(qǐng)輸入要查詢的IP:");
String ip = sc.next();
// 調(diào)用IPRequest里面的request方法
ipRequest.request(ip, new IRequest() {
@Override
public void success(IPBean ipBean) {
System.out.println("*************查詢結(jié)果*************");
System.out.println(ipBean.getResult());
}
@Override
public void fail(String msg) {
System.out.println(msg);
}
});
}
}
}
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!
您可能感興趣的文章:
- 使用Promise鏈?zhǔn)秸{(diào)用解決多個(gè)異步回調(diào)的問(wèn)題
- Android異步回調(diào)中的UI同步性問(wèn)題分析
- jQuery的promise與deferred對(duì)象在異步回調(diào)中的作用
- jquery Deferred 快速解決異步回調(diào)的問(wèn)題
- C#中異步回調(diào)函數(shù)用法實(shí)例
- Nodejs異步回調(diào)的優(yōu)雅處理方法
- JavaScript異步回調(diào)的Promise模式封裝實(shí)例
- python實(shí)現(xiàn)異步回調(diào)機(jī)制代碼分享
- C# 委托的三種調(diào)用示例(同步調(diào)用 異步調(diào)用 異步回調(diào))
- 跨平臺(tái)python異步回調(diào)機(jī)制實(shí)現(xiàn)和使用方法
- ajax異步回調(diào)函數(shù)中給外部變量賦值的問(wèn)題探討
相關(guān)文章
詳談Java靜態(tài)動(dòng)態(tài)的問(wèn)題
下面小編就為大家?guī)?lái)一篇詳談Java靜態(tài)動(dòng)態(tài)的問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09
Java漢字轉(zhuǎn)拼音類庫(kù)Pinyin4j詳細(xì)使用方法與實(shí)例
這篇文章主要介紹了Java漢字轉(zhuǎn)拼音類庫(kù)Pinyin4j詳細(xì)使用方法與實(shí)例,需要的朋友可以參考下2020-02-02
Java實(shí)現(xiàn)五子棋游戲單機(jī)版(1.0)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)五子棋游戲單機(jī)版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
servlet實(shí)現(xiàn)文件下載的步驟及說(shuō)明詳解
這篇文章主要為大家詳細(xì)介紹了servlet實(shí)現(xiàn)文件下載的步驟及說(shuō)明,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09
SpringBoot中@EnableAsync和@Async注解的使用小結(jié)
在SpringBoot中,可以通過(guò)@EnableAsync注解來(lái)啟動(dòng)異步方法調(diào)用的支持,通過(guò)@Async注解來(lái)標(biāo)識(shí)異步方法,讓方法能夠在異步線程中執(zhí)行,本文就來(lái)介紹一下,感興趣的可以了解一下2023-11-11
Springboot實(shí)現(xiàn)公共字段填充的示例詳解
這篇文章主要為大家詳細(xì)介紹了Springboot實(shí)現(xiàn)公共字段填充的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),對(duì)我們深入學(xué)習(xí)springboot有一定的幫助,感興趣的小伙伴可以了解下2023-10-10

