spark練習--由IP得到所在地


  今天我們就來介紹,如何根據一個IP來求出這個IP所在的地址是什么,首先我們如果要做這個內容,那么我們要有一個IP地址的所在地字典,這個我們可以在網上購買,形如:

  

1.0.1.0|1.0.3.255|16777472|16778239|亞洲|中國|福建|福州||電信|350100|China|CN|119.306239|26.075302
1.0.8.0|1.0.15.255|16779264|16781311|亞洲|中國|廣東|廣州||電信|440100|China|CN|113.280637|23.125178
1.0.32.0|1.0.63.255|16785408|16793599|亞洲|中國|廣東|廣州||電信|440100|China|CN|113.280637|23.125178
1.1.0.0|1.1.0.255|16842752|16843007|亞洲|中國|福建|福州||電信|350100|China|CN|119.306239|26.075302

   這個只是其中的一個小部分,我們可以來介紹一下這個如何查看,當我如果獲取一個IP,那我們首先先把這個IP轉換成為一個Long型的值,其中的轉換方法,后文會有介紹,然后我們在看上面的數據,以第一條數據為例

  1.0.1.0|1.0.3.255|16777472|16778239|亞洲|中國|福建|福州||電信|350100|China|CN|119.306239|26.075302

  這個以'|'來作為分隔符,其中的第二三個數字分別為:16777472,16778239這兩個數字,這個表示如果我們把上面的IP轉換成為Long值的情況,如果這個long的大小在16777472與16778239之間,那我們就可以說,這個IP是中國福建的電信,好了,解釋完成之后,我們就可以開始寫代碼了

package cn.wj.spark.day06

import java.io.{BufferedReader, FileInputStream, InputStreamReader}

import scala.collection.mutable.ArrayBuffer

/**
  * Created by WJ on 2017/1/4.
  */
object IPLocationDemo_2 {

  // 將IP轉換成為Long值
  def ip2Long(ip:String):Long ={
    val fragments = ip.split("[.]")
    var ipNum = 0L
    for(i <- 0 until fragments.length){
      ipNum = fragments(i).toLong | ipNum << 8L       //8進制變為10進制
    }
    ipNum
  }
   //進行二分法的查找,這個的前提是順序已經是排序過的了
  def binarySearch(lines: ArrayBuffer[String], ip: Long) : Int = {
    var low = 0
    var high = lines.length - 1
    while (low <= high) {
      val middle = (low + high) / 2
      if ((ip >= lines(middle).split("\\|")(2).toLong) && (ip <= lines(middle).split("\\|")(3).toLong))
        return middle
      if (ip < lines(middle).split("\\|")(2).toLong)
        high = middle - 1
      else {
        low = middle + 1
      }
    }
    -1
  }

  //從一個文件里面讀取數據
  def readData(path:String) = {
    val br = new BufferedReader(new InputStreamReader(new FileInputStream(path)))
    var s:String  = null
    var flag = true
    var lines = ArrayBuffer[String]()
    while(flag){
      s = br.readLine()
      if(s != null)
        lines += s
      else
        flag = false
    }
    lines
  }

  def main(args: Array[String]): Unit = {
    val ip ="118.144.130.10"
    val ipNum = ip2Long(ip)
    println(ipNum)
    val lines = readData("e://Test/ip.txt")
    val index = binarySearch(lines,ipNum)
    println(lines(index))
  }
}

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM