عند حصولك على IP شخص ما سواء من خلال تسجيل logging هذا العنوان القادم للسيرفر أو حتى عند قرائتك للSMTP Header من صندوق بريدك حتى تحصل على عنوان مرسل الرسالة الحقيقي أو غيرها من الحالات فإنك في الغالب تود الحصول على الدولة التي يوجد فيها هذا العنوان..
لحسن الحظ أي دولة لديها Range معين من العنواين وبالتالي يمكن بكل سهوله بعد الحصول على الIP هو التحقق من وجوده في المدى المعين للدولة وعند دخوله في ذلك المجال فمباشرة تستطيع القول بأن هذا الIP من الدولة الفلانية..
هناك بعض من المواقع تقدم هذه الخدمة كwhois ip ، وبعض من المواقع تقدم database صغيرة تستطيع تحميلها في جهازك مثلا:
http://ip-to-country.webhosting.info
http://software77.net/geo-ip/
http://www.maxmind.c…p/geoip_country
سوف نأخذ مثال على القاعدة الموجودة في الموقع الأول، فعند تحميلك للملف ip-to-country.CSV ستجده بهذا الشكل:
العمود الأول هو أول IP في المجال والعمود الثاني هو أخر IP في المجال، اما العمود الثالث والرابع فما رمز الدولة بحرفين وثلاثه والعمود الأخير هو اسم الدولة لكل من العناوين الموجودة في العمود الاول والثاني.. لاحظ أن العنوان ليست مكتوبة بالصيغة التقليدية A.B.C.D لكنها مكتوبه على شكل عدد صحيح حتى يسهل تخزينها والمقارنة فيما بينهما..
ولكي يتم تحويل الIP على شكل عدد ، يتم استخدام المعادلة:
A.B.C.D = A*256*256*256 + B*256*256 + C*256 + D
طريقة عمل الكلاس بسيطة، نقوم أولا بفتح هذا الملف والقرائه منه ثم تخزين هذه المعلومات في ArrayList ومن ثم ترتيبها ، وعندما تريد الاستعلام عن رقم IP ما ، فيتم البحث في هذه الArrayList باستخدام Binary Search ، أحب أن أشكر الCollections على توفير دوال Sort و BinarySearch للمبرمجين ..
يمكن القرائه من الملف بالطريقة العادية BufferedReader ولكني استخدمت Memory Mapped في هذا المثال حيث هي أسرع من الأولى في القرائه وان كان فارق السرعه في هذا المثال ليس بكبير ولكنه يوضح في أمثلة أخرى خصوصا عند العمل في الملفات الضخمة ..
عندما نريد عمل sort و binary search لأي كائن في ArrayList يجب أن يطبق implement هذا الكائن الComparable أو أن نرسل Comparator لهذه الدوال (sort,binarysearch) وفي داخل الComparator نوضح كيف تتم المقارنة في الكائن من النوع المعين.. وهذا ما قمت به في المثال using Comparator .
هذه الطريقة تتطلب بضعه ثواني كstartup (حتى يتم تحميل الملف في الذاكرة وترتيبه ).. ولكنها سريعه في البحث (أجزاء من الثانية)..
لاستخدام الكلاس:
public static void main(String[] args) throws FileNotFoundException,IOException{ String ip = "94.96.84.100" ; IP2Country ip2Country = new IP2Country(); Country country = ip2Country.getCountry(ip); System.out.println( "Country Name: " + country.getName() + "\n" + "Country Code: " + country.getCode2() + "\n" + "Country IP : " + ip ); }
قمت منذ فتره بعمل برنامج مشابه .. لكنه يقوم بعمل Query من المواقع سواء بإستخدام api أو crawl لل HTML
https://github.com/MuhammadHewedy/IpLookup
فهو كما الصفحه تذكر … يتمتع بخاصيتين Extensible و Intelligent
فالأولى هو أنك تستطيع أن تقوم بعمل impl لأي خدمه جديده
الثانيه أنه يقوم بعمل ترقيه سلبيه للمواقع التى لا تقوم بإرجاع نتيجه
يشرفنى أخى أن تعطينى رأيك فيه …