欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

IP查詢系統(tǒng)的異步回調(diào)案例

 更新時間:2017年02月16日 14:29:33   作者:沁宇  
本文主要分享了IP查詢系統(tǒng)的異步回調(diào)案例,具有很好的參考價值,下面跟著小編一起來看下吧

話不多說,請看代碼:

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ò)和接口的引用傳進去
  public Http(String addr, IResult iResult) {
    super();
    this.addr = addr;
    this.iResult = iResult;
    // 開啟線程 線程一開啟就產(chǎn)生了異步
    start();
  }
  @Override
  // 重寫線程的run方法,只要是網(wǎng)絡(luò)就要用到多線程
  public void run() {
    try {
      // 創(chuàng)建URL,把網(wǎng)絡(luò)地址傳進去
      URL url = new URL(addr);
      try {
        // 利用字符緩沖讀取流讀取網(wǎng)絡(luò)數(shù)據(jù)
        BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()));
        // 創(chuàng)建stringbuffer對象
        StringBuffer sb = new StringBuffer();
        // 創(chuàng)建一個臨時儲存字符串的變量
        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ò)請求發(fā)生異常
      iResult.fail("網(wǎng)絡(luò)請求失敗");
    }
  }
}
package com.lxj.demo;
import net.sf.json.JSONObject;
import com.xykj.demo.Http.IResult;
public class IPRequest {
  // 請求IP信息的回調(diào)接口,在這里必須要使用回調(diào),因為不知道Http什么時候下載完成
  public interface IRequest{
    void success(IPBean ipBean);
    void fail(String msg);
  }
  // 只要給一個ip地址和回調(diào)接口,我們可以通過回調(diào)接口傳回轉(zhuǎn)化好的ip信息對象
  public void request(String IP,IRequest iRequest){
    // 把用戶輸入的ip地址拼接到url中,發(fā)起Http請求
    String addr ="http://apicloud.mob.com/ip/query?key=520520test&ip="
        + IP
        + "";
    new Http(addr, new IResult() {
      // 創(chuàng)建完的IResult success和fail不會馬上調(diào)用,必須要等到Http下載完成或者發(fā)生異常才會調(diào)用
      @Override
      public void success(String msg) {
        // 把接收的json數(shù)據(jù)轉(zhuǎn)化成IPBean對象
        JSONObject jsonObject = JSONObject.fromObject(msg);
        IPBean ipBean = (IPBean) JSONObject.toBean(jsonObject, IPBean.class);
        // 產(chǎn)生回調(diào),把轉(zhuǎn)化好的對象傳遞出去給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方法,否則將打印的內(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對象
    IPRequest ipRequest = new IPRequest();
    while (true) {
      System.out.println("請輸入要查詢的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);
        }
      });
    }
  }
}

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!

相關(guān)文章

  • 詳談Java靜態(tài)動態(tài)的問題

    詳談Java靜態(tài)動態(tài)的問題

    下面小編就為大家?guī)硪黄斦凧ava靜態(tài)動態(tài)的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • java處理解析帶有反斜杠的json

    java處理解析帶有反斜杠的json

    在Java中操作JSON數(shù)據(jù)是一項常見的任務(wù),其中一個常見的問題是如何在JSON字符串中包含反斜杠,本文主要介紹了java處理解析帶有反斜杠的json,感興趣的可以了解一下
    2024-01-01
  • Java漢字轉(zhuǎn)拼音類庫Pinyin4j詳細(xì)使用方法與實例

    Java漢字轉(zhuǎn)拼音類庫Pinyin4j詳細(xì)使用方法與實例

    這篇文章主要介紹了Java漢字轉(zhuǎn)拼音類庫Pinyin4j詳細(xì)使用方法與實例,需要的朋友可以參考下
    2020-02-02
  • Java中初始化List集合的八種方式匯總

    Java中初始化List集合的八種方式匯總

    List?是?Java?開發(fā)中經(jīng)常會使用的集合,下面這篇文章主要給大家介紹了關(guān)于Java中初始化List集合的八種方式,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • Java實現(xiàn)五子棋游戲單機版(1.0)

    Java實現(xiàn)五子棋游戲單機版(1.0)

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)五子棋游戲單機版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • HashMap底層實現(xiàn)原理詳解

    HashMap底層實現(xiàn)原理詳解

    這篇文章主要介紹了HashMap底層實現(xiàn)原理詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • servlet實現(xiàn)文件下載的步驟及說明詳解

    servlet實現(xiàn)文件下載的步驟及說明詳解

    這篇文章主要為大家詳細(xì)介紹了servlet實現(xiàn)文件下載的步驟及說明,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • MyBatis?動態(tài)SQL使用及原理

    MyBatis?動態(tài)SQL使用及原理

    這篇文章主要為大家介紹了MyBatis動態(tài)SQL使用及原理的學(xué)習(xí)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • SpringBoot中@EnableAsync和@Async注解的使用小結(jié)

    SpringBoot中@EnableAsync和@Async注解的使用小結(jié)

    在SpringBoot中,可以通過@EnableAsync注解來啟動異步方法調(diào)用的支持,通過@Async注解來標(biāo)識異步方法,讓方法能夠在異步線程中執(zhí)行,本文就來介紹一下,感興趣的可以了解一下
    2023-11-11
  • Springboot實現(xiàn)公共字段填充的示例詳解

    Springboot實現(xiàn)公共字段填充的示例詳解

    這篇文章主要為大家詳細(xì)介紹了Springboot實現(xiàn)公共字段填充的相關(guān)知識,文中的示例代碼講解詳細(xì),對我們深入學(xué)習(xí)springboot有一定的幫助,感興趣的小伙伴可以了解下
    2023-10-10

最新評論