<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Terry.Li-彬

    虛其心,可解天下之問;專其心,可治天下之學(xué);靜其心,可悟天下之理;恒其心,可成天下之業(yè)。

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      143 隨筆 :: 344 文章 :: 130 評論 :: 0 Trackbacks
    一.功能介紹 ?

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

    返回的地理位置又分為3種精確度,程序可以按照自身需要選擇。三種精確度分別為:地區(qū)(省直轄市級),城市(地市級),詳細(xì)位置。例如對于“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個實(shí)現(xiàn)客戶端,一個為遠(yuǎn)程方法調(diào)用(phprpc協(xié)議實(shí)現(xiàn),類似hessian的一個協(xié)議),一個是socket長連接,一個nio。?

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

    性能測試結(jié)果:?

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

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

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

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

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

    上面的IP反查為guzz的服務(wù),因此需要應(yīng)用程序首先將guzz框架配置進(jìn)去。Guzz框架不具有應(yīng)用侵入性,不會影響現(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í)行查詢時,返回的是LocationResult對象,此對象有一些方法和變量按照不同精確度和用途存儲地理信息。LocationResult介紹:?
    Java代碼?
    1. ??????
    2. public?class?LocationResult?implements?Serializable?{??
    3. ??????
    4. ????/**如:對于國外地區(qū),值為“海外”;對于cityName中不包含省市信息的,如“清華大學(xué)”,值為地區(qū)名稱,如“北京”*/??
    5. ????public?String?cityMarker?;??
    6. ??
    7. ????/**查詢地市級名稱,如:貴州省六盤水市*/??
    8. ????public?String?cityName?;??
    9. ??????
    10. ????/**詳細(xì)地址,如:六枝特區(qū)騰龍網(wǎng)吧*/??
    11. ????public?String?detailLocation?;??
    12. ??????
    13. ????/**地區(qū)名稱,精確到??;對于國外,統(tǒng)一為:海外*/??
    14. ????public?String?areaName?;??
    15. ??????
    16. ????/**?
    17. ?????*?返回標(biāo)記后的城市名稱。此名稱用于進(jìn)行程序內(nèi)的城市匹配,不用于對網(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. ????}??

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

    第1步:在系統(tǒng)中配置phprpc框架。詳細(xì)請參看: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)返回的就是異步接口,在需要的時候調(diào)用get()即可;異步方法也支持超時,調(diào)用getOrCancel(5L, TimeUnit.SECONDS)可以讓接口最多等待5秒,隨后超時返回null。如果服務(wù)端故障,ipService.findLocation(ip)返回null。?

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

    5.?支持spring IOC嗎??支持。如果使用spring,IPService可以通過spring bean配置并進(jìn)行注入。這樣只需要2行代碼即可。?

    posted on 2010-11-17 22:29 禮物 閱讀(482) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發(fā)表評論。

    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 天天操夜夜操免费视频| 亚洲成av人影院| 三根一起会坏掉的好痛免费三级全黄的视频在线观看 | 精品亚洲视频在线观看| 99re6在线视频精品免费下载 | 花蝴蝶免费视频在线观看高清版| 亚洲黄色免费在线观看| 国产精品免费_区二区三区观看| 两个人www免费高清视频| 午夜在线a亚洲v天堂网2019| 国产国拍亚洲精品福利 | 亚洲1234区乱码| 在线观看国产区亚洲一区成人| 最近的中文字幕大全免费8| 亚洲Aⅴ在线无码播放毛片一线天| 亚洲狠狠婷婷综合久久久久| 毛片视频免费观看| 成在人线av无码免费高潮喷水 | 亚洲欧洲日产国码无码久久99| 日韩av无码成人无码免费| 久久九九免费高清视频| 在线观看亚洲AV日韩A∨| 亚洲国产精品无码成人片久久| 精品免费国产一区二区| 暖暖免费在线中文日本| 久久人午夜亚洲精品无码区| 久久亚洲精品无码AV红樱桃| 亚洲高清最新av网站| 无码中文在线二区免费| 免费观看久久精彩视频| 一级毛片**免费看试看20分钟| 国产成人精品日本亚洲网址 | 成人一级免费视频| 亚洲精华国产精华精华液| 久久久久久亚洲Av无码精品专口| 国产国拍亚洲精品福利| 国产成人免费a在线视频app| 久久天天躁狠狠躁夜夜免费观看| 无码人妻AV免费一区二区三区| 亚洲五月午夜免费在线视频| 黄色a三级免费看|