ข้อกำหนด: ให้ที่อยู่ URL ตัวอย่างเช่น: http://www.cncounter.com/tools/shorturl.php, แยกวิเคราะห์ที่อยู่ IP และหมายเลขพอร์ตที่เกี่ยวข้อง
หมายเหตุ: บทความนี้ไม่เกี่ยวข้องกับโปรโตคอล DNS พื้นฐาน แต่ใช้ API โดยตรงจากแพลตฟอร์ม Java ในการใช้งาน
DNS ยังเป็นบริการชื่อโดเมนซึ่งเป็นบริการชื่อโดเมน
เรารู้ว่าชั้นเรียนที่เกี่ยวข้องกับ URL ใน Java รวมถึง java.net.url และ java.net.uri ฯลฯ โดยที่ URI เป็นตัวเลือกทรัพยากรและอาจรวมถึงโปรโตคอลเช่นไฟล์:
ดังนั้นที่นี่เราใช้คลาส URL และรหัสเพื่อรับหมายเลขพอร์ตมีดังนี้:
/ ** * รับหมายเลขพอร์ต * * @param href url, ftp, http, nntp, ... ฯลฯ * @return * @throws ioexception */ parseport int คงที่สาธารณะ // หมายเลขพอร์ต; หากไม่ได้ระบุไว้อย่างชัดเจนใน HREF มันคือ -1 int port = url.getPort (); if (พอร์ต <0) {// รับหมายเลขพอร์ตเริ่มต้นของพอร์ตโปรโตคอลที่สอดคล้องกัน = url.getDefaultPort (); } ส่งคืนพอร์ต; -คลาส URL เป็นคลาสที่มีอยู่ใน Java ในช่วงแรก ๆ ตรรกะภายในค่อนข้างซับซ้อน หากคุณสนใจคุณสามารถดูรหัสการใช้งาน JDK ที่เกี่ยวข้องได้ด้วยตัวเอง
มี 2 วิธีในการรับหมายเลขพอร์ต:
getPort () คือการได้รับหมายเลขพอร์ตที่ระบุไว้ใน URL หากไม่ได้ระบุจะส่งคืน -1
getDefaultPort () คือการได้รับหมายเลขพอร์ตเริ่มต้นที่สอดคล้องกับโปรโตคอลเช่นหมายเลขพอร์ตเริ่มต้นของโปรโตคอล HTTP คือ 80 หมายเลขพอร์ตเริ่มต้นของโปรโตคอล HTTPS คือ 443 ฯลฯ
จากนั้นเราดูรหัสที่แยกส่วนโฮสต์:
/ ** * รับส่วนโฮสต์ * * @param href url, ftp, http, nntp, ... ฯลฯ * @return * @throws ioexception */ สตริงคงที่สาธารณะ parsehost (สตริง href) โยน ioexception {// url url = url ใหม่ (href); // รับสตริงชิ้นส่วนโฮสต์ = url.getHost (); โฮสต์กลับ; -ในสาระสำคัญคุณยังสามารถสกัดกั้นโฮสต์โดยตรงผ่านการแสดงออกหรือสตริงปกติ แต่ถ้าคุณพบสถานการณ์ที่ซับซ้อนมันไม่ง่ายที่จะจัดการเช่น: URL ที่ซับซ้อนเช่น https: // yourname: [email protected]/mumu-osc/nicefish.git
หลังจากแยกชื่อโดเมนคุณสามารถค้นหาที่อยู่ IP ผ่านคลาส java.net.inetaddress
รหัสมีลักษณะเช่นนี้:
/ ** * แก้ไขที่อยู่ IP ตามชื่อโดเมน (โฮสต์) * @param ชื่อโดเมนโฮสต์ * @return * @throws ioexception */ สตริงคงที่สาธารณะ parseip (สตริงโฮสต์) พ่น IOException {// ค้นหาที่อยู่ IP ตามชื่อโดเมน // ที่อยู่สตริงที่อยู่ IP = InetAddress.getHostAddress (); ที่อยู่ส่งคืน; -อย่างที่คุณเห็นเราใช้วิธีการ inetaddress.getByName () แบบคงที่เพื่อค้นหา IP
คลาสนี้ยังมีวิธีการคงที่อื่น ๆ แต่โดยทั่วไปจะไม่ได้ใช้มากนัก หากคุณสนใจคุณสามารถคลิกรหัสโอเพ่นซอร์สเพื่อดู
จากนั้นเราทำการทดสอบอย่างง่ายด้วยวิธีการหลัก ():
โมฆะคงที่สาธารณะหลัก (String [] args) พ่น ioexception {// string href = "http://www.cncounter.com/tools/shorturl.php"; // หมายเลขพอร์ต int port = parseport (href); // ชื่อโดเมนสตริงโฮสต์ = parseHost (href); // ที่อยู่สตริงที่อยู่ IP = parseip (โฮสต์); // system.out.println ("host =" + โฮสต์); System.out.println ("พอร์ต =" + พอร์ต); System.out.println ("ที่อยู่ =" + ที่อยู่); -ผลการดำเนินการคือ:
โฮสต์ = www.cncounter.comport = 80address = 198.11.179.83
เมื่อรู้หมายเลข IP และพอร์ตเราสามารถเชื่อมต่อโดยตรงผ่านซ็อกเก็ต
แน่นอนถ้าเป็นโปรโตคอล HTTP คุณสามารถใช้เครื่องมือ HTTPClient ของ Apache ซึ่งมีประสิทธิภาพและใช้งานง่าย แต่ข้อเสียอย่างหนึ่งของไลบรารีนี้คือรุ่นไม่เข้ากันได้และ API มักจะเปลี่ยนไปและจำเป็นต้องดำเนินการตามหมายเลขรุ่นเฉพาะเมื่อการเขียนโปรแกรม
รหัสที่สมบูรณ์มีลักษณะเช่นนี้:
นำเข้า java.io.ioException; นำเข้า java.net.*;/***ค้นหาที่อยู่ IP*/คลาสสาธารณะ testfinddns {โมฆะคงที่สาธารณะหลัก (สตริง [] args) โยน ioexception {// string href = "http://www.cncounter.com/tools // หมายเลขพอร์ต int port = parseport (href); // ชื่อโดเมนสตริงโฮสต์ = parseHost (href); // ที่อยู่สตริงที่อยู่ IP = parseip (โฮสต์); // system.out.println ("host =" + โฮสต์); System.out.println ("พอร์ต =" + พอร์ต); System.out.println ("ที่อยู่ =" + ที่อยู่); } / ** * รับหมายเลขพอร์ต * * @param href url, ftp, http, nntp, ... ฯลฯ * @return * @throws ioexception * / parseport int คงที่สาธารณะ // หมายเลขพอร์ต; หากไม่ได้ระบุไว้อย่างชัดเจนใน HREF มันคือ -1 int port = url.getPort (); if (พอร์ต <0) {// รับหมายเลขพอร์ตเริ่มต้นของพอร์ตโปรโตคอลที่สอดคล้องกัน = url.getDefaultPort (); } ส่งคืนพอร์ต; } / ** * รับชิ้นส่วนโฮสต์ * * @param href url, ftp, http, nntp, ... ฯลฯ * @return * @throws ioexception * / สตริงคงที่สาธารณะ parsehost (สตริง href) โยน ioexception {// url url = url ใหม่ (href); // รับสตริงชิ้นส่วนโฮสต์ = url.getHost (); โฮสต์กลับ; } / ** * แก้ไขที่อยู่ IP ตามชื่อโดเมน (โฮสต์) * * @param ชื่อโฮสต์ชื่อโดเมน * @return * @throws ioexception * / สตริงคงที่สาธารณะ parseip (สตริงโฮสต์) โยน ioexception {// ค้นหาที่อยู่ IP ตามชื่อโดเมน InetAddress inetAddress = inetAddress.getByName (โฮสต์); // ที่อยู่สตริงที่อยู่ IP = InetAddress.getHostAddress (); ที่อยู่ส่งคืน; -ตกลงโปรดดำเนินการบรรจุภัณฑ์และการประมวลผลที่เหมาะสมตามสถานการณ์เฉพาะ
สรุป
ข้างต้นเป็นวิธี Java ที่แนะนำโดยตัวแก้ไขให้คุณโดยการสอบถามที่อยู่ DNS/IP ตาม URL ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับทุกคนในเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!