السلام عليكم ورحمه الله وبركاته ،،
أحد أهم ميزات لغه الجافا هي سهوله التعامل مع البرامج التي تتعامل في الشبكه ، لذلك أصبح يطلق عليها The Language of Internet ، فشركه sun وفرت لنا طاقم جيد من الكلاسات يمكننا بكل سهوله عمل أي برنامج يتعامل في الشبكه وبدون الدخول في تفاصيل كيفيه الأرسال أو الأستقبال أو أي أمر أخر، مثلا برامج المحادثه Chatting ، برامج مشاركه الملفات Sharaing File ، العاب عبر الشبكه ، وبشكل عام يمكن بناء 90% من البرامج الشبكيه الموجوده بلغات أخرى . (هناك برامج لا تستطيع كتابتها بلغه الجافا كـ Ping وبرامج الأختبارات كهذه ) .
في هذه الجلسه الأولى Session One ، سوف نتناول بشكل عام :
- التعامل مع العنواين IP Address
- التعامل مع URI و URL وكيفيه عرض محتويات Web Page .
- برمجه Client\Server باستخدام TCP Socket .
- برمجه Client\Server باستخدام UDP Socket.
- اضافه الى بعض البرامج التطبيقيه كـ : Day-Time Server , Port Scanner , Simple Chat Program
ونبدأ على بركه الله ،،،
InetAddress Class :
==============
جميع الأجهزه المتصله بالأنترنت لها عنوان Address ، هذا العنوان IP يستخدم للوصول الى الجهاز المحدد ، ونظرا لصعوبه حفظ هذه العنواين ، تم تصميم نظام Domain Name System وتم أعطاء أسم Host Name لكل موقع ، الأن عندما أريد الوصول الى الموقع الفلاني سأستخدم الأسم Host Name ومن ثم سيتصل البرنامج الذي أستخدمه (مثلا المتصفح browser ) بالنظام الخاص بهذه الأسماء Local Domain Name Server وسيقوم بارجاع العنوان للأسم الذي أستقبله ، في حال لم يجد Local DNS العنوان المحدد للأسم ، سوف يتصل بDNS أخر ، وهكذا ... (يمكنك قرائه المزيد عن DNS في أي كتاب متعلق بالشبكات) .
والكلاس المسؤول عن هذه العمليه في جافا هو في الباكيج java.net وهو الكلاس InetAddress ووظيفته كما يتضح من الأسم هو التعامل مع العنوانين سواء أسم Host Name ، أو عنوان Address ، وأغلب الكلاسات الموجوده في java.net تتعامل أيضا مع هذا الكلاس .
وأهم الدوال الموجوده في هذا الكلاس /
كود
public static InetAddress getByName(String hostName );
هذه الداله تأخذ اسم الموقع أو الجهاز ، ومن ثم ترجع عنوانه IP Address ، وذلك باستخدام نظام Domain Name System أختصارا DNS ، أو تأخذ العنوان وترجع الأسم .
كود
public static InetAddress getLocalHost ();
هذه الداله ترجع العنوان للجهازالحالي ، وسوف يرجع 127.0.0.1 في حال لم تكن متصل بالأنترنت .
كود
public static InetAddress [] getAllByName ( String hostName);
هذه الداله نفس الداله ، ولكن اذا كان للموقع أكثر من عنوان ، فإن هذه الداله ترجع جميع العناوين للـ HostName (في شكل مصفوفه من InetAddress ) .
ملاحظات هامه :
الكلاس InetAddress يسمى Factory Class وذلك لعدم أحتوائه على داله بناء Constructor .
جميع الدوال السابقه دوال static ، ذلك سوف يتم استدعائها من خلال اسم الكلاس (.) اسم الداله .
عند التعامل مع دوال InetAddress ، فإنها تولد Exception من نوع Checked ، لذلك يجب التعامل مع هذا الإستثناء وذلك من خلال أما عمل try\catch ، أو thrwos للException .
الـ Exception الذي يولده هذا الكلاس هو : UnknownHostException ، وهو يحصل عندما لا يستطيع DNS إيجاد عنوان HostName وهذا يحدث اذا كان الـ HostName خاطئ ، أو مثلا الجهاز غير متصل بالأنترنت .
جميع الدوال السابقه عند أستدعائها فإنها تقوم بالأتصال Make Connection With DNS .
هناك دوال أخرى يوفرها InetAddress ، لكن هذه الدوال لا تقوم بعمل أتصال ، فقط تجلب بعض المعلومات الموجوده في الكائن من نوع InetAddress :
كود
public String getHostName( )
هذه الداله ترجع فقط أسم الموقع Host Name الموجود في الكائن InetAddress .
كود
public byte[] getAddress( )
هذه الداله ترجع عنوان الموقع على شكل مصفوفه من البايت ، تستخدم غالبا لأختبار هل العنوان من نوع IPv4 أو IPv6 .
كود
public String getHostAddress( )
تقوم بارجاع عنوان الموقع كنص String .
هناك أيضا دوال أخرى لمعرفه خصائص IP معين ، مثلا هل هو عنوان للنشر ، أو عنوان أختبار Loopback ، وغيرها من الخصائص ، هذه الدوال لن نحتاجها هنا في دروسنا السريعه وهي :
كود
public boolean isAnyLocalAddress( )
public boolean isLoopbackAddress( )
public boolean isLinkLocalAddress( )
public boolean isSiteLocalAddress( )
public boolean isMulticastAddress( )
public boolean isMCGlobal( )
public boolean isMCNodeLocal( )
public boolean isMCLinkLocal( )
public boolean isMCSiteLocal( )
public boolean isMCOrgLocal()
public boolean isLoopbackAddress( )
public boolean isLinkLocalAddress( )
public boolean isSiteLocalAddress( )
public boolean isMulticastAddress( )
public boolean isMCGlobal( )
public boolean isMCNodeLocal( )
public boolean isMCLinkLocal( )
public boolean isMCSiteLocal( )
public boolean isMCOrgLocal()
ويمكنك قراه الـ Documnation للمزيد حول هذه الدوال .
بالنسبه لنوع للعنواين فهي غالبا ما تكون 4 بايت (IPv4) مثل : 152.2.21.2 ، أما النوع الجديد للعنواين فهي 16 بايت ( IPv6)ويكتب بنظام Hex مثل : 2001:0250:02FF:0210:0250:8BFF:FEDE:67C8 . وهناك كلاسين خاصين بهذا الأمر ، لكن لم أجد أي فائده منهم ، حيث أنها ورثت Extends الكلاس InetAddress ، اضافه الى أن جميع برامجنا الشبكيه سوف تعمل في طبقه التطبيقات Application Layer وفي هذه الطبقه لا نحتاج الى معرفه نوع العنوان .
كود
public final class Inet4Address extends InetAddress
public final class Inet6Address extends InetAddress
public final class Inet6Address extends InetAddress
لكن في حاله أردنا أن نعرف ما هو نوع العنوان ، يمكن أن نستخدم الداله :
كود
public byte[] getAddress( )
ومن خلال طول المصفوفه ، سوف نعرف نوع العنوان . بعد قليل سنشاهد مثال لذلك .
أخيرا هناك الدوال التي يرثها الكلاس InetAddress من الكلاس Object ، حيث:
كود
public class InetAddress extends Object implements Serializable
الدوال هي (طبعا تم عمل Override لها) :
كود
public boolean equals(Object o)
وهي للاختبار التساوي، وهنا يتساوى InetAddress مع أخر في حاله كان لهما نفس العنوان Address .
سنرى مثال بعد قليل على هذه الداله .
كود
public int hashCode( )
لن تحتاج لهذه الداله لأنها تستخدم في HashTable .
كود
public String toString( )
الداله toString() يتم استدعائها في حاله قمنا بطباعه العنوان فقط بدون تحديد أي داله أخرى ، وهنا الكلاس InetAddress قام بعمل Override للداله toString() ، وأصحبت تطبع getHostName() "\" getHostAddress() ، أي بالشكل :
hostname/dotted quad address
أمثله تطبيقيه على الـ InetAddress :
مثال ، لمعرفه العنوان الحالي للجهاز LocalHost :
كود
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Demo
{
public static void main (String args[])
{
try
{
InetAddress address = InetAddress.getLocalHost();
System.out.println( "\n\nHostName/Address : " + address );
System.out.println( "HostName/Address : " + address.toString() );
System.out.println( "Host Name : " + address.getHostName() );
System.out.println( "Address : " + address.getHostAddress() );
}
catch (UnknownHostException e)
{
System.out.println("Cannot Find Local Host !");
System.exit(1);
}
}
}
import java.net.UnknownHostException;
public class Demo
{
public static void main (String args[])
{
try
{
InetAddress address = InetAddress.getLocalHost();
System.out.println( "\n\nHostName/Address : " + address );
System.out.println( "HostName/Address : " + address.toString() );
System.out.println( "Host Name : " + address.getHostName() );
System.out.println( "Address : " + address.getHostAddress() );
}
catch (UnknownHostException e)
{
System.out.println("Cannot Find Local Host !");
System.exit(1);
}
}
}
المخرج ، وقد يختلف بالطبع اذا كنت متصل بالانترنت :
HostName/Address : romansy-9f0da85/127.0.0.1
HostName/Address : romansy-9f0da85/127.0.0.1
Host Name : romansy-9f0da85
Address : 127.0.0.1
مثال لاستخراج جميع عنواين موقع ما وليكن google :
كود
// print All IP for Site
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Demo
{
public static void main (String[] args)
{
try
{
InetAddress[] addresses = InetAddress.getAllByName("www.google.com");
for (int i = 0; i < addresses.length; i++)
System.out.println(addresses[i]);
}
catch (UnknownHostException e)
{
System.out.println("Could not find www.google.com");
}
}
}
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Demo
{
public static void main (String[] args)
{
try
{
InetAddress[] addresses = InetAddress.getAllByName("www.google.com");
for (int i = 0; i < addresses.length; i++)
System.out.println(addresses[i]);
}
catch (UnknownHostException e)
{
System.out.println("Could not find www.google.com");
}
}
}
المخرج :
www.google.com/72.14.253.147
www.google.com/72.14.253.99
www.google.com/72.14.253.103
www.google.com/72.14.253.104
مثال لاستخدام الداله getAddress() ، وهنا سوف نختبر نوع العنوان هل هو IPv4 ـ أو IPv6 ، وذلك عن طريق النظر الى طول المصفوفه الناتجه :
كود
public static int getVersion(InetAddress ia) {
byte[] address = ia.getAddress( );
if (address.length == 4) return 4;
else if (address.length == 16) return 6;
else return -1;
}
byte[] address = ia.getAddress( );
if (address.length == 4) return 4;
else if (address.length == 16) return 6;
else return -1;
}
مثال لمقارنه عنوان مع عنوان :
كود
// Compare Two InetAddress
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Demo
{
public static void main(String args[])
{
try
{
InetAddress ca = InetAddress.getByName("www.google.ca");
InetAddress com = InetAddress.getByName("www.google.com");
if (ca.equals(com))
System.out.println("same");
else
System.out.println("not the same");
}
catch ( UnknownHostException e)
{
System.out.println("Cannot Find Host Name !");
}
}
}
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Demo
{
public static void main(String args[])
{
try
{
InetAddress ca = InetAddress.getByName("www.google.ca");
InetAddress com = InetAddress.getByName("www.google.com");
if (ca.equals(com))
System.out.println("same");
else
System.out.println("not the same");
}
catch ( UnknownHostException e)
{
System.out.println("Cannot Find Host Name !");
}
}
}
النتيجه هنا :
not the same
تمرين :
أكتب برنامج يدخل String من الكيبورد أو يستقبله كمعامل من Command Line ، في حاله كان هذا النص عنوان قم بطباعه الأسم HostName ، وفي حاله كان النص هو HostName قم بطباعه العنوان ، البرنامج مشابه لـ برنامج nslookup هو أحد البرامج في Unix .
وفي المرفقات ، مثال بسيط كتبته من فتره ، يقوم بنفس المهمه ، ولكن في شكل GUI .
الى هنا نتوقف ، ونكمل المره القادمه في URL ، وباذن الله نكتب متصفح Browser بسيط للغايه ، الى اللقاء .
