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-09Java漢字轉(zhuǎn)拼音類庫(kù)Pinyin4j詳細(xì)使用方法與實(shí)例
這篇文章主要介紹了Java漢字轉(zhuǎn)拼音類庫(kù)Pinyin4j詳細(xì)使用方法與實(shí)例,需要的朋友可以參考下2020-02-02Java實(shí)現(xiàn)五子棋游戲單機(jī)版(1.0)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)五子棋游戲單機(jī)版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04servlet實(shí)現(xiàn)文件下載的步驟及說(shuō)明詳解
這篇文章主要為大家詳細(xì)介紹了servlet實(shí)現(xiàn)文件下載的步驟及說(shuō)明,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09SpringBoot中@EnableAsync和@Async注解的使用小結(jié)
在SpringBoot中,可以通過(guò)@EnableAsync注解來(lái)啟動(dòng)異步方法調(diào)用的支持,通過(guò)@Async注解來(lái)標(biāo)識(shí)異步方法,讓方法能夠在異步線程中執(zhí)行,本文就來(lái)介紹一下,感興趣的可以了解一下2023-11-11Springboot實(shí)現(xiàn)公共字段填充的示例詳解
這篇文章主要為大家詳細(xì)介紹了Springboot實(shí)現(xiàn)公共字段填充的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),對(duì)我們深入學(xué)習(xí)springboot有一定的幫助,感興趣的小伙伴可以了解下2023-10-10