كيف يمكنك معرفة ما إذا كانت السلسلة هي عنوان IP أو اسم مضيف

StackOverflow https://stackoverflow.com/questions/66923

  •  09-06-2019
  •  | 
  •  

سؤال

إذن لديك سلسلة يتم استردادها من واجهة مستخدم الويب الخاصة بالمسؤول (لذا فهي بالتأكيد سلسلة).كيف يمكنك معرفة ما إذا كانت هذه السلسلة هي عنوان IP أو اسم مضيف في Java؟

تحديث:أعتقد أنني لم أوضح نفسي، كنت أتساءل أكثر عما إذا كان هناك أي شيء في Java SDK يمكنني استخدامه للتمييز بين عناوين IP وأسماء المضيفين؟آسف على الارتباك وشكرا لكل من أخذ/سيأخذ الوقت للرد على هذا.

هل كانت مفيدة؟

المحلول

يمكنك استخدام تعبير عادي بهذا النمط:

\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b

سيخبرك ذلك ما إذا كان عنوان IPv4.

نصائح أخرى

هل علينا أن نفترض ذلك يكون واحد أو آخر، وليس شيئا مختلفا تماما؟إذا كان الأمر كذلك، فمن المحتمل أن أستخدم التعبير العادي لمعرفة ما إذا كان يطابق التنسيق "الرباعي المنقط".

يمكنك معرفة ما إذا كانت السلسلة تتطابق مع تنسيق number.number.number.number، على سبيل المثال:

\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b

سوف تتطابق مع أي شيء من 0 - 999.

أي شيء آخر يمكنك جعله افتراضيًا هو اسم المضيف.

URI validator = new URI(yourString);

سيقوم هذا الرمز بالتحقق من صحة عنوان IP أو اسم المضيف.(يطرح استثناء URI تالفًا إذا كانت السلسلة غير صالحة)

إذا كنت تحاول التمييز بين الاثنين .. فأنا أفتقد قراءة سؤالك.

ألا يمكنك فقط مطابقة التعبير العادي عليه؟

يمكنك استخدام مدير الأمن مع InetAddress.getByName(addr) يتصل.

إذا لم يكن العنوان رباعيًا منقطًا، getByName سيحاول إجراء اتصال لإجراء البحث عن الاسم، والذي يمكن لمدير الأمان التقاطه كملف checkConnect(addr, -1) call، مما يؤدي إلى طرح SecurityException الذي يمكنك اكتشافه.

يمكنك استخدام System.setSecurityManager() إذا كنت تعمل بامتيازات كاملة لإدراج مدير الأمان المخصص الخاص بك قبل getByName تم إجراء المكالمة.

الأمر ليس بهذه البساطة كما قد يبدو، فهناك بعض الغموض حول الأحرف مثل الواصلات والشرطة السفلية والأقواس المربعة '-'، '_'، '[]'.

لدى Java SDK بعض القيود في هذا المجال.عند استخدام InetAddress.getByName، سيتم إرساله إلى الشبكة للقيام بتحليل اسم DNS وحل العنوان، وهو أمر مكلف وغير ضروري إذا كان كل ما تريده هو اكتشاف المضيف مقابل العنوان.وأيضًا، إذا تمت كتابة عنوان بتنسيق مختلف قليلاً ولكنه صالح (شائع في IPv6)، فلن ينجح إجراء مقارنة سلسلة على نتائج InetAddress.getByName.

مكتبة جافا IPAddress سوف تفعل ذلك.جافادوك متاح على الرابط.تنصل:أنا مدير المشروع.

static void check(HostName host) {
    try {
        host.validate();
        if(host.isAddress()) {
            System.out.println("address: " + host.asAddress());
        } else {
            System.out.println("host name: " + host);
        }
    } catch(HostNameException e) {
        System.out.println(e.getMessage());
    }
}

public static void main(String[] args) {
    HostName host = new HostName("1.2.3.4");
    check(host);
    host = new HostName("1.2.a.4");
    check(host);
    host = new HostName("::1");
    check(host);
    host = new HostName("[::1]");
    check(host);
    host = new HostName("1.2.?.4");
    check(host);  
}

انتاج:

address: 1.2.3.4
host name: 1.2.a.4
address: ::1
address: ::1
1.2.?.4 Host error: invalid character at index 4
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top