قم بإنشاء تطبيق خادم عميل في Java حيث يمكن أن يكون للكلا الجهازين عناوين IP ديناميكية

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

  •  02-10-2019
  •  | 
  •  

سؤال

هذا ما أخطط للقيام به. لنفترض أن هناك جهازان A و B. أحتاج إلى إنشاء تطبيق يمكن من خلاله إرسال الجهاز A إلى الجهاز B ، باستخدام Java SE.

أعلم أنه لإجراء اتصال ، تحتاج إلى إنشاء كائن من فئة ServersOction واستخدام طريقة القبول () كـ

في الآلة ب:Serversocket SS = Serversocket (12000) ؛

احيانا صحيح)

{

Socket s = ss.accept () ؛

      .
      .
      .
      .

}

في الجهاز أ:

Socket S = مقبس جديد ("عنوان IP للآلة B>",12000);

                .
                .
                .
                .

ها هي المشكلة.

افترض إذا يتم تعيين عنوان IP الخاص بالآلة B ديناميكيًا مع DHCP, ، أي أنه يمكن أن يتغير في كل مرة يعيد فيها تشغيل الجهاز.

هل هناك أي طريقة يمكن من خلالها Java PGM في الجهاز A التعرف على عنوان IP الخاص بـ B دون أن يكتب المستخدم يدويًا ؟؟؟

على أمل أن يكون السؤال واضحا. في انتظار الردود!

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

المحلول

تحتوي معظم خوادم DNS على آلية تتيح لخادم DHCP إجراء تحديثات ديناميكية للمنطقة المحلية (الداخلية). إذا كان لديك هذه الميزة تحت تصرفك ، فيمكنك فقط استخدام أسماء DNS ، والسماح للأنظمة التي تتأكد من أن سجلات DNS محدثة مع إيجار DHCP.

يمكن تحقيق نهج مماثل قائم على DNS على الإنترنت الأوسع باستخدام خدمة DDNS مثل Dyndns.

إذا لم تتمكن من استخدام DNS ، فأنت عالق مع نهج قائم على البث UDP. هذه هي نفس الآلية التي تستخدمها بروتوكولات مثل DHCP و Bonjour و SMB للعثور على أجهزة كمبيوتر أخرى على الشبكة المحلية دون معرفة عناوينها ؛ وسيعمل هذا النهج فقط في نفس السياقات التي تعمل فيها هذه التقنيات (عادة ، فقط داخل الشبكة المحلية ، وبالتأكيد ليس عبر الإنترنت الأكبر).

في Java ، ستحقق رسائل البث UDP عبر datagramsocket صف دراسي.

نقلاً عن مستندات API:

يتم دائمًا تمكين عمليات إرسال UDP على DatagramSocket. من أجل استلام حزم البث ، يجب أن يكون DatagramSocket مرتبطًا بعنوان Wildcard. في بعض التطبيقات ، يمكن أيضًا استلام حزم البث عندما يكون DatagramSocket مرتبطًا بعنوان أكثر تحديدًا.

مثال:

DatagramSocket s = new DatagramSocket(null); 
s.bind(new InetSocketAddress(8888)); 

وهو ما يعادل:

DatagramSocket s = new DatagramSocket(8888); 

ستقوم كلتا الحالتين بإنشاء datagramsocket قادر على تلقي عمليات البث على منفذ UDP 8888.

إذا كانت أجهزتك موجودة في مواقع متباينة على الإنترنت ، ولا يمكنك استخدام خدمة DDNS (مثل Dyndns ، المذكورة أعلاه) ، فإن أفضل رهان لك هو إنشاء خادم تسجيل مركزي. سيكون هذا خادمًا بسيطًا (يمكن أن يكون خدمة ويب) يعمل على عنوان معروف على الإنترنت. ستسجل كل من آلات العميل الخاصة بك في خادم التسجيل المركزي ، وبالتالي فإن خادم التسجيل المركزي سيعرف عناوين IP لكلا الجهازين. ثم يمكن لكل جهاز أن يطلب عنوان الآخر عبر خادم التسجيل المركزي. يجب أن تضع بعض التفكير في الأمن من أجل الحماية من "التسمم" الضار بسجلك ، ولكن على خلاف ذلك ، سيكون هذا مستقيمًا إلى حد ما.


تعديل:

لقد اكتشفت للتو Jxta. إنها مجموعة من الأدوات لبناء تطبيقات Java مع ميزات الشبكات من نظير إلى نظير. ليس لدي أي تجربة مباشرة معها ، لكن يبدو أنه سيحقق ما تبحث عنه (وربما يوفر لك الكثير من العمل على الحاجة إلى بناء كل شيء من نقطة الصفر).

في الواقع ، يبدو أن المشروع الفرعي P2psockets يفعل بالضبط ما تريد.

نصائح أخرى

في Java ، يمكنك حساب عنوان IP الخاص بالآلة باسم المضيف ، إليك الرمز

 java.net.InetAddress inetAdd = java.net.InetAddress.getByName("www.ibm.com");
 System.out.println("IP Address is : " + inetAdd.getHostAddress());

استخدم هذا الرمز للحصول على عنوان IP الذي تم تغييره في كل مرة إعادة تشغيل الجهاز

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top