深藍(lán)色心情

          過來聊聊~~~~

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            31 Posts :: 0 Stories :: 46 Comments :: 0 Trackbacks
          服務(wù)地址和接口已經(jīng)更改,新的使用手冊(cè)在:http://www.guzzservices.com/2010/man_ip_service/
          一.功能介紹
           

          通過傳入的IP地址,返回IP所在的地理位置。如傳入“58.16.209.19”,返回“貴州省六盤水市 ”。 

          返回的地理位置又分為3種精確度,程序可以按照自身需要選擇。三種精確度分別為:地區(qū)(省直轄市級(jí)),城市(地市級(jí)),詳細(xì)位置。例如對(duì)于“58.16.209.19”,三種精度的值為: 

          Java代碼 
          1. 地區(qū):貴州     
          2. 城市:貴州省六盤水市    
          3. 詳細(xì)地址:六枝特區(qū)騰龍網(wǎng)吧  

          二.3行代碼實(shí)現(xiàn)地域查詢 

          Java代碼 
          1. //第1行,獲取IP反查服務(wù)(JSP中寫的)  
          2. IPLocationService ipService = (IPLocationService) GuzzWebApplicationContextUtil.getGuzzContext(session.getServletContext()).getService("IPService") ;  
          3.   
          4. //第2行,執(zhí)行查詢。findLocation方法傳入要查詢的IP地址。  
          5. LocationResult result = (LocationResult) ipService.findLocation("58.16.209.19").get() ;  
          6.   
          7. //第3行,按照精確度要求,讀取地理位置  
          8. System.out.println("城市:" + result.cityName) ;  

          三.性能如何? 

          上面的第1步需要獲取IP反查服務(wù),此服務(wù)有3個(gè)實(shí)現(xiàn)客戶端,一個(gè)為遠(yuǎn)程方法調(diào)用(phprpc協(xié)議實(shí)現(xiàn),類似hessian的一個(gè)協(xié)議),一個(gè)是socket長(zhǎng)連接,一個(gè)nio。 

          針對(duì)這兩種實(shí)現(xiàn),在內(nèi)網(wǎng)下進(jìn)行性能測(cè)試。測(cè)試方法:?jiǎn)尉€程,串行執(zhí)行查詢請(qǐng)求。查詢IP:59.66.106.0,返回地理位置:清華大學(xué)。 

          性能測(cè)試結(jié)果: 

          PHPRPC實(shí)現(xiàn):執(zhí)行1000次查詢,耗時(shí)1339ms。 

          Socket實(shí)現(xiàn):執(zhí)行1000次查詢,耗時(shí)84ms;執(zhí)行10000次查詢,耗時(shí)843ms。 

          NIO socket實(shí)現(xiàn):執(zhí)行1000次查詢,耗時(shí)115ms;執(zhí)行10000次查詢,耗時(shí)1247ms。 

          Socket長(zhǎng)連接模式為連接池實(shí)現(xiàn),可以配置多個(gè)socket并行計(jì)算。對(duì)于絕大部分的應(yīng)用,應(yīng)該都能滿足要求。PHPRPC為短連接,每次查詢都建立一個(gè)http連接進(jìn)行查詢。 

          四.如何配置到我的系統(tǒng)中? 

          上面的IP反查為guzz的服務(wù),因此需要應(yīng)用程序首先將guzz框架配置進(jìn)去。Guzz框架不具有應(yīng)用侵入性,不會(huì)影響現(xiàn)有系統(tǒng)運(yùn)轉(zhuǎn)。配置方法:http://code.google.com/p/guzz/wiki/TutorialConfig 

          Guzz框架整合完畢后,只需要將IP反查服務(wù)在guzz中聲明即可。聲明包含3步(以socket的IP服務(wù)為例): 

          1. 將IP反查的實(shí)現(xiàn)jar包放到項(xiàng)目lib中。Jar包在附件中,包含源代碼。 

          2. 在guzz.xml中增加此服務(wù): 
          Xml代碼 
          1. <service name="IPService" configName="fundIPServiceSocketClient" class="org.guzz.service.dir.impl.socket.IPLocationServiceSocketClientImpl" />  

          3. 配置服務(wù)參數(shù)(guzz的properties文件): 
          Properties代碼 
          1. [fundIPServiceSocketClient]  
          2. pool.maxActive=5  
          3. host=services.guzz.org  
          4. port=11546  

          參數(shù)中包含連接池大小,服務(wù)地址和端口。 

          配置完服務(wù)以后,就可以按照上一節(jié)的方式進(jìn)行IP反查了。如附件中的示例jsp實(shí)現(xiàn)。 

          五.LocationResult介紹 

          執(zhí)行查詢時(shí),返回的是LocationResult對(duì)象,此對(duì)象有一些方法和變量按照不同精確度和用途存儲(chǔ)地理信息。LocationResult介紹: 
          Java代碼 
          1.       
          2. public class LocationResult implements Serializable {  
          3.       
          4.     /**如:對(duì)于國(guó)外地區(qū),值為“海外”;對(duì)于cityName中不包含省市信息的,如“清華大學(xué)”,值為地區(qū)名稱,如“北京”*/  
          5.     public String cityMarker ;  
          6.   
          7.     /**查詢地市級(jí)名稱,如:貴州省六盤水市*/  
          8.     public String cityName ;  
          9.       
          10.     /**詳細(xì)地址,如:六枝特區(qū)騰龍網(wǎng)吧*/  
          11.     public String detailLocation ;  
          12.       
          13.     /**地區(qū)名稱,精確到省;對(duì)于國(guó)外,統(tǒng)一為:海外*/  
          14.     public String areaName ;  
          15.       
          16.     /** 
          17.      * 返回標(biāo)記后的城市名稱。此名稱用于進(jìn)行程序內(nèi)的城市匹配,不用于對(duì)網(wǎng)友顯示。 
          18.      */  
          19.     public String getMarkedCityName(){  
          20.         if(cityMarker == null){  
          21.             return cityName ;   
          22.         }else{  
          23.             return cityMarker + cityName ;  
          24.         }  
          25.     }  
          26.       
          27.     public String toString(){  
          28.         StringBuilder sb = new StringBuilder() ;  
          29.         sb.append("cityMarker:").append(cityMarker)  
          30.           .append("cityName:").append(cityName)  
          31.           .append("detailLocation:").append(detailLocation)  
          32.           .append("areaName:").append(areaName) ;  
          33.           
          34.         return sb.toString() ;  
          35.     }  
          36.       
          37.     }  

          六.我的查詢請(qǐng)求不多,如何配置phprpc方式的查詢(不需要保持socket連接池)? 

          第1步:在系統(tǒng)中配置phprpc框架。詳細(xì)請(qǐng)參看:http://phprpc.org 

          第2步:將剛才guzz.xml中IPService服務(wù)換成PHPRPC實(shí)現(xiàn): 
          Java代碼 
          1. <service name="IPService" configName="fundIPServiceClient" class="org.guzz.service.dir.impl.IPLocationServiceClientImpl" />  

          第3步:配置服務(wù)參數(shù)(properties文件): 
          Properties代碼 
          1. [fundIPServiceClient]  
          2. rpc.protocol=phprpc  
          3. rpc.serviceURL=http://services.guzz.org/service/IPService  

          七.其他: 

          1. JDK1.6+。如果使用JDK1.5,將源代碼在1.5下編譯即可。 

          2. 沒看明白如何配置服務(wù)? 看這里:http://code.google.com/p/guzz/wiki/TutorialService 

          3. IP反查可不可以異步執(zhí)行? 可以。ipService.findLocation(ip)返回的就是異步接口,在需要的時(shí)候調(diào)用get()即可;異步方法也支持超時(shí),調(diào)用getOrCancel(5L, TimeUnit.SECONDS)可以讓接口最多等待5秒,隨后超時(shí)返回null。如果服務(wù)端故障,ipService.findLocation(ip)返回null。 

          4. 為什么會(huì)返回null? 沒有查詢到就返回null,null也很有用,如網(wǎng)易評(píng)論中的“火星網(wǎng)友”。 

          5. 支持spring IOC嗎? 支持。如果使用spring,IPService可以通過spring bean配置并進(jìn)行注入。這樣只需要2行代碼即可。 
          附件下載地址:http://dl.javaeye.com/topics/download/08c5a323-0c58-3fd7-a2ca-07a4dd9aa199
          posted on 2010-06-22 11:59 深藍(lán)色心情 閱讀(3442) 評(píng)論(9)  編輯  收藏 所屬分類: Java

          Feedback

          # re: 3行代碼,實(shí)現(xiàn)IP到地理位置的反查功能 2010-06-22 13:01 @joe
          ip反查--最終用到的.dat數(shù)據(jù)文件才是核心..是否權(quán)威,是否合法...?  回復(fù)  更多評(píng)論
            

          # re: 3行代碼,實(shí)現(xiàn)IP到地理位置的反查功能 2010-06-22 15:10 jackzhangyunjie
          這個(gè)東西的實(shí)際用途會(huì)是那里?
            回復(fù)  更多評(píng)論
            

          # re: 3行代碼,實(shí)現(xiàn)IP到地理位置的反查功能 2010-06-22 15:22 深藍(lán)色心情
          @jackzhangyunjie

          實(shí)用性很強(qiáng)。如匿名發(fā)帖都可以轉(zhuǎn)成“XXX地區(qū)網(wǎng)友”,現(xiàn)在新聞評(píng)論基本上都這樣了。另外廣告,日志系統(tǒng)等都存在大量地理分析的需求。  回復(fù)  更多評(píng)論
            

          # re: 3行代碼,實(shí)現(xiàn)IP到地理位置的反查功能 2010-06-22 15:24 深藍(lán)色心情
          @@joe

          核心數(shù)據(jù)文件在服務(wù)器端保存,如果多個(gè)項(xiàng)目使用,只需要維護(hù)或者購買一份即可。

          這是一個(gè)例子,services.guzz.org中用的.dat文件是純真IP數(shù)據(jù)庫,免費(fèi)合法。準(zhǔn)確度也還可以。
            回復(fù)  更多評(píng)論
            

          # re: 3行代碼,實(shí)現(xiàn)IP到地理位置的反查功能 2010-06-22 17:13 愛看小說網(wǎng)
          果然是不錯(cuò)的代碼,謝謝,收藏了。  回復(fù)  更多評(píng)論
            

          # re: 3行代碼,實(shí)現(xiàn)IP到地理位置的反查功能[未登錄] 2010-06-25 14:10 海邊沫沫
          收藏

          還有這樣好的服務(wù)請(qǐng)多介紹下  回復(fù)  更多評(píng)論
            

          # re: 3行代碼,實(shí)現(xiàn)IP到地理位置的反查功能 2010-07-14 16:59 青格兒
          怎么我運(yùn)行不了啊.總報(bào)空指針異常啊.
          LocationResult result = (LocationResult) ipService.findLocation("58.16.209.19").get() ; //這句報(bào)錯(cuò).

          你們都可以嗎?   回復(fù)  更多評(píng)論
            

          # re: 3行代碼,實(shí)現(xiàn)IP到地理位置的反查功能 2010-07-16 17:49 darkbluefeeling
          @青格兒
          需要可以訪問外網(wǎng)才能,你看看services.guzz.org:11546通不通。  回復(fù)  更多評(píng)論
            

          # re: 3行代碼,實(shí)現(xiàn)IP到地理位置的反查功能 2011-02-13 10:22 2134er
          32wedscfg  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 寿阳县| 荔波县| 巢湖市| 区。| 塔河县| 姚安县| 班玛县| 松溪县| 娄底市| 迁西县| 辽阳县| 广昌县| 商城县| 眉山市| 彝良县| 和田县| 阿勒泰市| 普格县| 建水县| 浦北县| 左贡县| 那曲县| 全州县| 蒙山县| 正蓝旗| 阳山县| 阳信县| 尤溪县| 玉门市| 霞浦县| 安康市| 瓦房店市| 习水县| 交口县| 湖口县| 红安县| 宁夏| 绵竹市| 晴隆县| 玛纳斯县| 方山县|