• 0
romansy

Start Network Programming In Java

سؤال

السلام عليكم ورحمه الله وبركاته ،،

أحد أهم ميزات لغه الجافا هي سهوله التعامل مع البرامج التي تتعامل في الشبكه ، لذلك أصبح يطلق عليها 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()

ويمكنك قراه الـ 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 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);
}
}
}

المخرج ، وقد يختلف بالطبع اذا كنت متصل بالانترنت :

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");
}
}
}

المخرج :

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;



}

مثال لمقارنه عنوان مع عنوان :

// 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 !");
}

}

}

النتيجه هنا :

not the same

تمرين :

أكتب برنامج يدخل String من الكيبورد أو يستقبله كمعامل من Command Line ، في حاله كان هذا النص عنوان قم بطباعه الأسم HostName ، وفي حاله كان النص هو HostName قم بطباعه العنوان ، البرنامج مشابه لـ برنامج nslookup هو أحد البرامج في Unix .

وفي المرفقات ، مثال بسيط كتبته من فتره ، يقوم بنفس المهمه ، ولكن في شكل GUI .

الى هنا نتوقف ، ونكمل المره القادمه في URL ، وباذن الله نكتب متصفح Browser بسيط للغايه ، الى اللقاء .

IP_Finder.rar

تم تعديل بواسطه romansy
7

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

95 إجابة على هذا السؤال .

  • 0

أهلا dr_sara .

بالنسبه لحلك فهو يطبع العنوان والأسم ، للاسم الذي أدخلته في s2 .

وهو ليس المطلوب بالضبط !

المطلوب هو :

اذا أدخل عنوان ، فيطبع فقط الأسم Host Name .

واذا أدخل اسم ، فيطبع فقط العنون Address .

يعني مثلا : لو شغلنا البرنامج من command Line :

java Answer www.google.com

122.34.53.13

java Answer 122.34.53.13

www.google.com

المدخل باللون الأخضر ، والمخرج بالأحمر .

أرجوا أن يكون وضح السؤال ، وأرجوا المعذره على عدم توضيحه أولا .

لما اضع لة ip بالارقام يعطنى الرقم على انة string لا يعطنى اسم الموقع

أي كود تقصدين ؟

عموما ، عندما أرسل للداله getByName عنوان ، واريد أن أطبع اسم Host Name فقط ، سأستدعى الداله :

System.out.println( address.getHostName());

وهنا سيطبع أسم Host وليس العنوان .

تحياتي .

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

لي عودة بإذن الله

تحياتي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم ...

احب اسجل اعجابي بهذه المبادرة ... جعلها الله في ميزان حسناتك اخي الكريم ..

حاولت احل التمرين ... و وصلت الى طريقة (نص كم) تعتمد على استخدام toString اللي ترجع العنوان كامل .. و بعدها تقارنه بالذي

تم ادخاله من قبل المستخدم ... و تحلل النص المدخل مع العنوان الكامل كما يلي :

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Scanner;

public class demoNet {

public static void main(String[] args) throws UnknownHostException
{
Scanner scan = new Scanner(System.in);
System.out.println ("Please enter the Host Name or Address");
String host = scan.next();

InetAddress address = InetAddress.getByName(host);

String whole_address = address.toString();

System.out.println ("Your complete address is : " + whole_address);

String part1 = whole_address.substring(0, whole_address.indexOf("/"));
String part2 = whole_address.substring(whole_address.indexOf("/") + 1);

if (host.equals(part1))
System.out.println ("The IP is: " + part2);
else if(host.equals(part2))
System.out.println ("The host name is: " + part1);
else
System.out.println ("ERROR :) ");

}
}

طبعاً اعرف انها طريقة غير جيده ... و اتصور ان هناك داله لها علاقة بالتحقق من الـ HostName تعيد قيمة من Boolean ان كان IP او لا

و لكن لا ادري ما هذه الدالة بالضبط ...

اختي العزيزة الدكتورة يبدو ان افكارنا تسير في نفس الاتجاة ... و لكن ماذا اذا ادخل المستخدم اسم جهاز او موقع لا يبدأ بـ www ;)

تم تعديل بواسطه بنت اليمن
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أولاً ِاشكرك على هذا المجهود الرائع ... ووفقك الله

بالنسبة إلي لم أفهم ما قد شرح هنا مائة في المائة ... ولكن عندما طبقت ما قد شرح وجدت ان هذا الاستدعاء لا يعمل

import java.util.Scanner

فالجافا لا تعرفها ... فما العمل ... وهل استطيع ان اجد بدائل لهذه الطريقة ..؟

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
السلام عليكم ورحمة الله وبركاتة

اخى الفاضل اكيد انت تعمل على jdk قديم مثل jdk3 اذا استخدمت --jdk5-or -jdk 6 بتجدها تعمل ان شاء الله فقط الاصدار لم يوجد بة هذا الكلاس

بالتوفيق ان شاء الله

شاكر لك دكتورة سارة على هذا الجواب ... ولمعلومية أنا لدي مكتبتين للجافا

الاولى j2sdk1.4.1 وهذه استخدمها في تطبيقات الجافا

والثانية jdk1.5.0_06 وهذه استخدمها للـ JSP و Servelt

بالنسبة للسادسة فلا اعرفها ... ولكن افهم من كلامك فيما قو قمت بتحويل مكتبة تطبيقات الجافا الى مكتبة JSP سوف تعمل باذن الله .... أو لابد تحويلها إلى الاصدار السادس ..؟؟

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
اختى العزيزة بنت اليمين شكرا لمشاركتك الجميلة ولنقد كودى

اليكى نقد كودك فانتى لم تضعى exception نرجو مراجعة الدرس وكما انة لا يعمل بالصورة المطلوبة

وننتظر المزيد من النقد الهادف لوجة الله حتى نبقى احسن الامم

العفو اختي .. و انا اسفة اذا ثقلت عليكي ... و الموضوع اقل من ان يكون انتقاد .. اسفه مرة اخرى.

و بالنسبة للـ Exception اذا رجعتي الى كودي بتلاحظي اني عملي throws بعد الدالة main ، لاحظي :

public static void main(String[] args) throws UnknownHostException

سلامي

تم تعديل بواسطه بنت اليمن
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
السلام عليكم ورحمة الله وبركاتة

اذا هذا هو البرنامج بعد التعديل ارجو يكون صحيح هذة المرة

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Demo
{
public static void main (String args[])
{


if(args[0].length()==0){
System.out.println("you must enter host");
}else{
String s1=args[0].toString();


try {
InetAddress address = InetAddress.getByName(s1);
if(s1.startsWith("www")){
System.out.println( "HostName : " + address.getHostAddress());
}
else{
System.out.println( "Address : " + address.getHostName());
}
} catch (UnknownHostException ex) {
ex.printStackTrace();
}




}
}
}

بالمناسبة اقصد البرنامج فى المرفقات فهو لا يعمل بشكلة الصحيح الذى حضرتك طلبة فى التمرين

شكرا للشرح وننتظر المزيد

جزاك الله خير

بالتوفيق ان شاء الله

عفوا لكن عند ال runtime ضهر لي

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0

اما بالنسبة لي بنت اليمن فسؤالها دائما يدور في بالي وهوا كيف سنفصل اسم او host name الحاسب الشخصي الموجود بالشبكة الداخلية

عن اسم الموقع

يعني انا جربت حط اسم جهاز داخلي الشبكة الداخلية جلبلي ip ولما بحط اسم موقع " مع www طبعا " كما بيعطيني الاي بي

يا هالترا في طريقة تمنع هذا وتسمح بهذا او بالعكس .....

مشكورين على احب اللفاتات في المنتدا الى قلبي ....

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

و الآن اليكم هذا الكود ... هو خليط من مجموعة افكار و جدتها ( مجرب و بسيط وحلو عشان الحبايب :) )

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Scanner;

public class demoNet {

public static void main(String[] args) throws UnknownHostException
{
Scanner scan = new Scanner(System.in);
System.out.println ("Please enter the Host Name or Address");
String host = scan.next();

InetAddress address = InetAddress.getByName(host);

if(Character.isDigit(host.charAt(0)))
System.out.println ("Your Host Name: " + address.getHostName());
else
{
String address_str = address.getHostAddress();
System.out.println ("Your IP Address is:");
System.out.println (address_str);

}


}
}

تم تعديل بواسطه بنت اليمن
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

مشكورين على التفاعل ،

والإجابات صحيحه ، وان كان الحل الأخير هو الأفضل من بين الحلول ....

نكمل على بركه الله ..

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم ورحمه الله وبركاته ،

نكمل ما توقفنا فيه المره السابقه وهو موضوع الـ URL ، حيث يمكننا من خلال هذا الكلاس الوصول بكل سهوله الى أي ملف في أي سيرفر ، وعرف محتويات هذا الملف ، وبدون الدخول في تفاصيل كيفيه الإستقبال .

URL class

========

الـ URL هي اختصار لـ Uniform Resource Locator ومن خلال هذا المحدد يمكننا الوصول الى أي ملف موجود في سيرفر ما ، وبشكل عام يتكون الـ URL من بروتوكول (مثل http , ftp ) و اسم الموقع ، اسم ملف ما ضمن الموقع ، وبورت في بعض الأحيان ، اضافه الى جزء # وهي الوصول الى نقطه محدده في الملف ، أخيرا جزء الأستعلام Query (بعض الـ URL لا تحتوي علي استعلام).

أي يكون بهذا الشكل :

protocol :://hostName:port/file/file2.html#a

مثل :

ftp://ftp.redhat.com/pub/

http://www.arabteam2000.com/

في جافا نستطيع التعامل مع URL عن طريق الكلاس URL وهو موجود في java.net ، وهذا الكلاس لا يستطيع أي كلاس أخر التعامل معه ماعدا الكلاسات الموجوده في الjava.net فقط ، اضافه الى أنه Immutable اي أن لا تتغير قيمته بعد اعطائه قيمه .

في هذه الجزئيه اليوم ، سوف نتناول ثلاث نقاط متعلقه بموضوع URL وهي :

- كيفيه انشاء URL

- كيفيه تقسيم URL وعرض معلومات الURL (كالبروتوكول المستخدم ، والبورت والخ)

- كيفيه الحصول على محتويات URL (اي الصفحه التي يشير اليها الURL ) .

كيفيه انشاء URL :

-------------------

هنا يوفر لدينا الكلاس URL سته دوال بناء constructors ، نستطيع من خلالها انشاء كائن URL ، وأهم دوال بناء مستخدمه هي :

public URL(String url) throws MalformedURLException
public URL(String protocol, String hostname, String file) throws MalformedURLException
public URL(URL base, String relative) throws MalformedURLException

داله البناء الأولى تستقبل String ومن ثم تحوله الى كائن من نوع URL ، لاحظ هنا أن دوال البناء السابقه جميعها تولد استثناء Exception من نوع MalformedURLException ، وهو يحصل في حاله كان البرتوكول المستخدم غير معرف لدى Virtual Machine ، أو كان هناك خطأ في كتابه النص .

معنى هذا الكلام اذا كان البرتوكول معرف ، فلن يحصل Exception . وحاليا java 1.5 تدعم أغلب البرتوكولات المعروفه مثل : http, file, ftp, mailto, ldap, and gopher وغيرها من البروتوكولات .

النص String الذي تستقبله هذه الداله ، يجب أن يحتوي على protocol ، اضافه الى hostname ، وبعض الأحيان يحتوي على ملف ما ، وبورت معين ، وreference الى نقطه معينه في صفحه .

مثال لطريقه استخدام داله البناء هذه :

try {

URL u = new URL("http://www.arabteam2000.org/");

}

catch (MalformedURLException ex) {

System.err.println(ex);

}

لاحظ كما ذكرت أن الـ Exception لن يحصل ابدا الا في حاله كان protocol غير معروف ، أو طريقه كتابه النص المرسل لل URL خاطئ (يعني لم أحدد بروتوكول في الأول ، أو نسيت وضع علامه : بعد اسم البرتوكول ) ، غير ذلك لن يحصل .

أي أن URL لا يعرف هل الصفحه التي حددناها في الأعلى موجوده أو لا . فقط ينشئ منها كائن URL .

حاليا بما أننا عرفنا متي يحصل الException ، وهو عندما لا يتعرف VM على البرتوكول أو خطأ في الكتابه ، ممكن نكتب برنامج يقوم بالتأكد من دعم VM للبروتوكول الفلاني ، أي في كل مره أنشيء URL ببروتوكول مختلف ، في حال حصل Exception وكان النص صحيح ، فسوف نعرف أن البرتوكول غير مدعوم ، والا فهو مدعوم من VM .

// Test Supproted Protocol

import java.net.URL;
import java.net.MalformedURLException;

public class Demo
{
public static void main (String args[])
{
testURL("http://localhost");
testURL("mailto://localhost");
testURL("ftp://localhost");
testURL("https://localhost");
testURL("gopher://localhost");
testURL("telnet://localhost");
testURL("file://localhost");
testURL("nfs://localhost");
testURL("jdbc:mysql://localhost");
testURL("rmi://localhost");
testURL("doc://localhost");
testURL("systemresource://localhost");
testURL("netdoc://localhost");
testURL("verbatim://localhost");
testURL("http:");

}

public static void testURL ( String s)
{
try
{
URL u = new URL(s);
System.out.println( u.getProtocol() + " is Supported in VM");
}
catch ( MalformedURLException e)
{
String a = s.substring(0,s.indexOf(':'));
System.out.println(a + " is Not Supported in VM");
}
}
}

المثال أعلاه يقوم بارسال النص الى الداله والتي تنشئ URL من هذا النص ، في حال حصل Exception نعرف أن البرتوكول غير مدعوم .

المخرج :

C:\Java>java Demo

http is Supported in VM

mailto is Supported in VM

ftp is Supported in VM

https is Supported in VM

gopher is Supported in VM

telnet is Not Supported in VM

file is Supported in VM

nfs is Not Supported in VM

jdbc is Not Supported in VM

rmi is Not Supported in VM

doc is Supported in VM

systemresource is Supported in VM

netdoc is Supported in VM

verbatim is Supported in VM

http is Supported in VM

داله البناء الثانيه هي :

public URL(String protocol, String hostname, String file)  throws MalformedURLException

وهي لنفس الوظيفه ولكن تستقبل معاملات عده ، مثال لطريقه الأستخدام :

try {

URL u = new URL("http", "www.eff.org", "/blueribbon.html#intro");

}

catch (MalformedURLException ex) {

// All VMs should recognize http

في الكود أعلاه ، تم انشاء كائن من نوع URL يشير الى http://www.eff.org/blueribbon.html#intro ، وبما أننا لم نحدد بورت port معين ، فسيتم أختيار البورت الأفتراضي للبرتوكول المستخدم ، وبما أننا نستخدم برتوكول Http اذا البورت الأفتراضي default port هي 80 .

لاحظ أن المعامل الثالث في داله البناء السابقه والذي هو الملف يجب أن يبدأ بالعلامه / والا سيتم اعتباره أنه تابع لاسم الموقع . فيجب الأنتباه الى ذلك .

ويمكن أيضا أن نكتب البرنامج السابق ، ولكن باستخدام داله البناء هذه ، نأخذ المثال التالي ليوضح الأمر :

// Protocol Tester

import java.net.URL;
import java.net.MalformedURLException;

public class Demo
{
public static void main (String args[])
{
String host = "localhost";
String file = "/index.html"; // see the / at the begnning

String protocol [] =
{"http","ftp","telnet","gopher","file","rmi","jdbc",
"https","doc","netdoc","nfs","jar","finger","daytime","systemresource",
"jndi","ldap","mailto"};

for (int i=0; i< protocol.length; i++)
{
try
{
URL u = new URL(protocol[i],host,file);
System.out.println( protocol[i] + " is Supported ");
}
catch ( MalformedURLException e)
{
System.out.println( protocol[i] + " is Not Supported ");
}
}
}
}

لاحظ أننا هنا قمنا بزياده بعض من البرتوكولات التي لم نختبرها في المثال الأول :

المخرج :

C:\Java>java Demo

http is Supported

ftp is Supported

telnet is Not Supported

gopher is Supported

file is Supported

rmi is Not Supported

jdbc is Not Supported

https is Supported

doc is Supported

netdoc is Supported

nfs is Not Supported

jar is Supported

finger is Not Supported

daytime is Not Supported

systemresource is Supported

jndi is Not Supported

ldap is Not Supported

mailto is Supported

داله البناء الثالثه :

public URL(URL base, String relative) throws MalformedURLException

وهي مفيده جدا عندما نريد التنقل بين صفحات مسار معين ، مثلا :

try {

URL u1 = new URL("http://www.ibiblio.org/javafaq/index.html");

URL u2 = new URL (u1, "mailinglists.html");

}

catch (MalformedURLException ex) {

System.err.println(ex);

}

أعلاه ، كانت u1 يشير الى http://www.ibiblio.org/javafaq/index.html ، بعدها أردنا أن ننتقل الى صفحه أخرى موجوده في نفس المسار فقمنا باستخدام داله البناء هذه ، ومررنا لها u1 مع اسم الصفحه الجديده . وهنا يكون دور داله البناء هذه هو حذف اسم index.html من u1 واضافه mailinglists.html ليكون الناتج http://www.ibiblio.org/javafaq/mailinglists.html موجودفي u2 .

كيفيه تقسيم URL وعرض معلومات الURL:

------------------------------------------------

يتكون الـ URL من 5 مكونات :

protocol : وهو البرتوكول المستخدم

authority : وهو اسم الصفحه hostName ، واسم المستخدم ورقم البورت اذا كان هناك .

path : المسارالى صفحه ما

fragment identifier : وهو الجزء الخاص بالوصول الى نقطه معينه في صفحه ref ويبدأ عاده بعد علامه # .

query : وهو جزء الأستعلام الموجود في الصفحه ويبدأ عاده بعد علامه ؟ .

نأخذ أمثله :

http://www.ibiblio.org/javafaq/books/jnp/i...=1565922069#toc

هنا :

protocol هو http

authority : هو www.ibiblio.org

path : هو /javafaq/books/jnp/index.html

fragment identifier : هو toc

query : هو isbn=1565922069

موقع أخر :

http://www.faqs.org/rfcs/rfc2396.html

هنا

protocol هو http

authority : هو www.faqs.org

path : هو /rfcs/rfc2396.html

لاحظ هنا لا يوجد استعلام ولا reference .

نتحدث الأن عن الـ authority ، وهو يتكون من اسم مستخدم ، رقم البورت ، واسم الموقع host ، نأخذ مثال لمثل هذه الURL :

http://[email protected]:8080/

هنا :

protocol هو http

authority هو [email protected]:8080

وهو يقسم الى :

اسم مستخدم : admin

اسم الموقع : www.blackstar.com

رقم البورت : 8080

نستعرض الأن الدوال الموجوده في URL و التي تقوم بهذا التقسيم ،وهي :

public String getProtocol( )
public String getHost( )
public int getPort( )
public int getDefaultPort( )
public String getFile( )
public String getPath( )
public String getRef( )
public String getQuery( )
public String getUserInfo( )
public String getAuthority( )

شرح بسيط للدوال ، مع أنه يمكن معرفه عمل الداله من أسمها :

getProtocol تقوم بعرض البرتوكول المستخدم في url .

getHost تقوم بعرض اسم الموقع في url .

getPort هنا تقوم بعرض port المستخدم في url ، اذا لم يتم تحديد port فتكون القيمه الناتجه هي -1 .

getDefaultPort تقوم بعرض port الخاص بالبرتوكول المستخدم .

getFile تقوم بعرض المسار من البدايه (اي من بعد علامه / ) الى بدايه جزء الreference أي قبل علامه # .

getPath تقوم بنفس عمل الداله السابقه ، ولا يوجد أختلاف ، مع أن قرأت أنها تختلف مع الداله السابقه في أنها لا ترجع جزء الأستعلام ، ولكن من خلال تجربتي لم الاحظ أي أختلاف يذكر، ويمكنك التأكد من ذلك من الأمثله القادمه .

getQuery تقوم بارجاع الجزئيه الخاصه بالاستعلام وهي تبدأ من ? .

getUserInfo تقوم بارجاع اسم المستخدم اذا كان موجود ، والا ترجع null . يكون اسم المستخدم قبل علامه @ في URL .

getAuthority ترجع اسم المستخدم ورقم البورت واسم الموقع ، وفي حال لم تجد اسم مستخدم ورقم بورت فإنها ترجع فقط اسم الموقع أي تكون مثل getHost .

مثال لعرض معلومات URL :

// splitt URL 

import java.net.URL;
import java.net.MalformedURLException;

public class Demo
{
public static void main (String args[])
{
if ( args.length > 0 )
{
try
{
URL u = new URL(args[0]);

System.out.println("\n\nURL : " + u );
System.out.println("\nProtocol is : " + u.getProtocol());
System.out.println("Host Name is : " + u.getHost());
System.out.println("port is : " + u.getPort());
System.out.println("Defualt Port : " + u.getDefaultPort());
System.out.println("File is : " + u.getFile());
System.out.println("Path is : " + u.getFile());
System.out.println("Refernce is : " + u.getRef());
System.out.println("Query is : " + u.getQuery());
System.out.println("User Info : " + u.getUserInfo());
System.out.println("Authority : " + u.getAuthority());

}
catch ( MalformedURLException e)
{ System.out.println("Protocal is Not Supported !"); }
}
else
System.out.println("Error , Usage : java DEMO URL");
}
}

مثال لتنفيذ البرنامج :

java Demo http://www.ibiblio.org/javafaq/books/jnp/i...=1565922069#toc

URL : http://www.ibiblio.org/javafaq/books/jnp/i...=1565922069#toc

Protocol is : http

Host Name is : www.ibiblio.org

port is : -1

Defualt Port : 80

File is : /javafaq/books/jnp/index.html?isbn=1565922069

Path is : /javafaq/books/jnp/index.html?isbn=1565922069

Refernce is : toc

Query is : isbn=1565922069

User Info : null

Authority : www.ibiblio.org

مثال أخر :

java Demo ftp://ftp.userfriendly.org:8000/

URL : ftp://ftp.userfriendly.org:8000/

Protocol is : ftp

Host Name is : ftp.userfriendly.org

port is : 8000

Defualt Port : 21

File is : /

Path is : /

Refernce is : null

Query is : null

User Info : null

Authority : ftp.userfriendly.org:8000

مثال أخر :

java Demo ftp://Wajdy:[email protected]:21000/c%3a/

URL : ftp://Wajdy:[email protected]:21000/c%3a/

Protocol is : ftp

Host Name is : 138.247.121.61

port is : 21000

Defualt Port : 21

File is : /c%3a/

Path is : /c%3a/

Refernce is : null

Query is : null

User Info : Wajdy:Essam

Authority : Wajdy:[email protected]:21000

كيفيه الحصول على محتويات URL :

---------------------------------------

الى هنا عرفنا كيف يمكن أن ننشئ URL ، أيضا كيف يمكن معرفه معلومات الـ URL ، ولكن الى الأن لم نستفد بشيء حقيقي ! أي لم يكن هناك أي أرسال أو استقبال من الـ URL (لم يحدث أي أتصال )، وهو ما سنتحدث عنه هنا .

وهناك عده طرق لجلب المحتويات منها هذه الداول الموجوده بالطبع في كلاس URL :

public InputStream openStream( ) throws IOException

public URLConnection openConnection( ) throws IOException

public Object getContent( ) throws IOException

public Object getContent(Class[] classes) throws IOException

نبدأ بالطريقه الأولى وهي باستخدام الداله openStream ، وهي ترجع كائن من نوع InputStream ، البيانات الموجوده في هذا الـ InputStream تكون في صوره uninterpreated أي raw data بيانات غير مفسره ، وتقوم أنت بتفسيرها بالطريقه التي تريد ، فمثلا محتويات صفحه html تكون هي كود html يمكنك مثلا طباعه هذه على الشاشه ، ومثلا محتويات mp3 هي binary data يمكنك من تخزينها في ملف ما .

مثال ، قرائه محتويات url وطباعه المحتويات على الشاشه (بغض النظر عن ماهيه المحتويات) ، تذكر أنك يجب أن تكون متصل بالانترنت حتى تستطيع الأتصال بـ URL :

// print URL Content on screen

import java.net.URL;
import java.net.MalformedURLException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Demo
{
public static void main (String args[])
{
if ( args.length > 0 )
{
try
{
URL u = new URL (args[0]);

BufferedReader br = new BufferedReader(
new InputStreamReader( u.openStream() ) );

String content = "";

while ( ( content=br.readLine()) != null )
System.out.println( content );

}
catch ( MalformedURLException e)
{
String s = args[0].substring(0,args[0].indexOf(':'));
System.out.println(s + " is Not Supported");
}
catch ( IOException e)
{ e.printStackTrace(); }

}
else
System.out.println("Invalid Usage , Try : java Demo URL");
}
}

مثال لتنفيذ البرنامج :

java Demo

Invalid Usage , Try : java Demo URL

java Demo ssX:ss

ssX is Not Supported

java Demo http://localhost/wajdy/O'Reilly's.htm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<!-- saved from url=(0071)http://www.hackemate.com.ar/textos/O'reilly%20-%20Comp

lete%20Bookshelf/ -->

<HTML><HEAD><TITLE>O'Reilly's</TITLE>

<META http-equiv=Content-Type content="text/html; charset=windows-1256">

<META content="MSHTML 6.00.2800.1106" name=GENERATOR></HEAD>

<BODY text=#000000 bgColor=#ffffff>

<H2>Bookshelves:</H2>

<P><B><FONT size=+1>The Networking CD Bookshelf:</FONT></B>

<P><IMG alt="The NetworkingCD Bookshelf Navigation"

src="O'R

هنا بقيه الكود ........

src="O'Reilly's_files/samba.s.gif" border=0></A> </BODY></HTML>

لاحظ أعلاه في الكود ، أننا مررنا محتويات InputStream الى InputStreamReader وهو خاص بتحويل المحتويات من byte الى Character ، وبعدها قمنا بتمريره الى BufferedReader ومنه سوف نقرأ مباشره طبعا على شكل Character Stream .

يمكن أن نغير من هذه العاده القديمه ، وأن نستخدم الكلاس Scanner فهو يقوم بالتحويل من تلقاء نفسه ، وهنا نفس الكود لكن مع القرائه من InputStream وذلك باستخدام Scanner :

Scanner input = new Scanner ( u.openStream() );

while ( input.hasNext() )
System.out.println( input.nextLine() );

عند استخدامنا للداله OpenStream فهي فقط ترجع المحتويات ، ولا ترجع مثل Http Header ، أيضا لا يمكنني أن أرسل معلومات الى ذلك الـ URL فقط استرجع محتويات الـ URL .

وفي حاله أردنا أن نرسل لهذا الـ URL بيانات ما يجب أن نستخدم الداله الأخرى وهي openConnection .

الداله الثانيه :

public URLConnection openConnection( ) throws IOException

وهي كما هو واضح ترجع كائن من نوع URLConnection ، وعن طريق هذا الكائن سوف نستطيع أن نرسل بيانات الى URL ، الكلاس URLConnection لن نتناوله حاليا في هذه المقدمه ، ولكن سوف يكون في الجزء الثاني ان شاء الله Session 2 .

وهذا مثال يشابه المثال السابق ، ولكن باستخدام هذه الداله :

// print URL Content on screen

import java.net.URL;
import java.net.MalformedURLException;
import java.net.URLConnection;
import java.io.IOException;
import java.util.Scanner;

public class Demo
{
public static void main (String args[])
{
if ( args.length > 0 )
{
try
{
URL u = new URL (args[0]);

URLConnection uc = u.openConnection();
Scanner input = new Scanner (uc.getInputStream());

String content = "";

while ( input.hasNext() )
System.out.println( input.nextLine() );

}
catch ( MalformedURLException e)
{
String s = args[0].substring(0,args[0].indexOf(':'));
System.out.println(s + " is Not Supported");
}
catch ( IOException e)
{ e.printStackTrace(); }

}
else
System.out.println("Invalid Usage , Try : java Demo URL");
}
}

بالنسبه للدوال :

public Object getContent( ) throws IOException
public Object getContent(Class[] classes) throws IOException

فهي ترجع المحتوي الذي يشير اليه URL ككائن من نوع Object ، وهو أمر غير عملي ، حيث عليك أن تختبر هل الكائن العائد هو مثلا يتبع instanceof لـ InputStream أو يتبع ImageProducer اذا كان صوره، أو كان مثلا صوت AppletAudioClip وهكذا ..

أخر مجموعه من الدوال هي :

public boolean sameFile(URL other)
public String toExternalForm( )
public URI toURI( ) throws URISyntaxException

// now this Methods com from Object class
public String toString( )
public boolean equals(Object o)

الداله sameFile تختبر هل الملف في url الأول هو نفسه الملف في الثاني ، وترجع قيمه منطقيه true , false .

الداله equals هي نفسها الداله السابقه ولكنها تختبر الReference الموجود أيضا ، بينما sameFile لا تختبره .

أما الداله toExternalForm فهي تحول URL الى String .

الداله toString أيضا لنفس الأمر ، وهي تستخدم toExternalForm .

مثال لتوضيح عمل هذه الدوال :

// Test For Utilites Method

import java.net.URL;
import java.net.MalformedURLException;

public class Demo
{
public static void main (String args[])
{
try
{
URL u1 = new URL(args[0]);
URL u2 = new URL(args[1]);

System.out.println("\n\nu1 : " + u1.toExternalForm());
System.out.println("u2 : " + u2.toString());

System.out.println("\n\n");

if ( u1.sameFile(u2) )
System.out.println(u1 + " \nis the same file as \n" + u2 );
else
System.out.println(u1 + " \nis Not the same file as \n" + u2 );

System.out.println("\n\n");

if ( u1.equals(u2) )
System.out.println(u1 + " \nis same as \n" + u2 );
else
System.out.println(u1 + " \nis Not same as \n" + u2 );
}
catch ( MalformedURLException e)
{ e.printStackTrace(); }
}
}

تنفيذ البرنامج :

java Demo http://www.google.com/a.html http://www.google.com/a.html#toc

u1 : http://www.google.com/a.html

u2 : http://www.google.com/a.html#toc

http://www.google.com/a.html

is the same file as

http://www.google.com/a.html#toc

http://www.google.com/a.html

is Not same as

http://www.google.com/a.html#toc

نتوقف هنا هذه المره ، ونكمل المره القادمه في برنامج متصفح ويب Browser بسيط للغايه ، الى ذلك الوقت ، يمكنكم حل التمرين التالي :

أكتب برنامج يستقبل URL من الـ Command Line أو Keyboard لا يهم ، المهم اذا كان هذا امتداد URL هو java او html أو txt أو cpp قم بعرض محتويات الـ URL على الشاشه ، أما اذا كان غير ذلك قم بحفظ محتويات الـ URL في ملف اسمه هو نفس اسم الملف الموجود في الـ URL .

مثال للمدخلات والمخرجات من التمرين :

java HomeWork http://localhost/wajdy/a.html

هنا المخرج سوف يكون كود HTML الموجود في a.html .

java HomeWork http://localhost/wajdy/b.java

هنا المخرج سوف يكون محتويات ملف b.java .

java HomeWork http://localhost/wajdy/x.mp3

هنا لن تكون هناك مخرجات ، لكننا سوف نحمل ملف x.mp3 ونخرنه في الجهاز ، أي سوف يكون هناك ملف اسمه x.mp3 في المسار الحالي للبرنامج .

java HomeWork http://localhost/wajdy/photo.gif

سوف نحمل الصوره ، ونخرنها في الجهاز بنفس الأسم photo.gif .

اذا لم يكن لديك انترنت لتجرب ، يمكنك عمل سيرفر في جهازك ، بواسطه مثلا برنامج اباتشي سيرفر ، وبعدها قم بتجربه البرنامج ، وكما هو واضح في الأدخال السابق استخدمت localhost لأني أعمل على هذا السيرفر .

الى اللقاء. :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

الموضوع اليوم جميل جداً ... جزاك الله كل الخير

و هذا حلي للتمرين :

 import java.net.URL;
import java.net.MalformedURLException;
import java.io.PrintWriter;
import java.io.IOException;
import java.util.Scanner;

public class TestURL {

public static void main(String[] args) throws MalformedURLException, IOException
{
Scanner scan = new Scanner(System.in);
System.out.println ("Please enter your file's URL: ");

URL url = new URL(scan.nextLine());
String path = url.getFile();
String file_name = path.substring(path.lastIndexOf("/") + 1);
String file_extension = file_name.substring(file_name.lastIndexOf(".") + 1);

scan = new Scanner(url.openStream());

if (( file_extension.compareTo("java") == 0) || ( file_extension.compareTo("html") == 0) || ( file_extension.compareTo("txt") == 0) || ( file_extension.compareTo("cpp") == 0))
{
System.out.println ("-------------- Start printing the file on the screen -------------");
while(scan.hasNextLine())
System.out.println (scan.nextLine());
System.out.println ("-------------- End printing the file on the screen -------------");
}

else
{
PrintWriter file = new PrintWriter(file_name);
while(scan.hasNextLine())
file.write(scan.nextLine());
System.out.println ("-------------- End printing the file to an external file -------------");
file.close();
}
}
}

سلامي للجميع ،،

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

عزيزتي الغالية الدكتورة انا التي ينبغي ان تشكرك على تحمسك لموضوع اخونا رومنسي فمشاركاتك هنا تعطي للموضوع نكهة جميلة بالنسبة لي :)

اولاً نحن متفقين ان الملف ان لم يكن من الانواع التي ذكرت الموضوع فإنه ينبغي ان تحفظ و لا تتعرض ..بالنسبة للحفظ فإنه كما طلب يجب ان يكون في نفس مسار البرنامج الحالي :

هنا لن تكون هناك مخرجات ، لكننا سوف نحمل ملف x.mp3 ونخرنه في الجهاز ، أي سوف يكون هناك ملف اسمه x.mp3 في المسار الحالي للبرنامج .

و لهذا عملت في الكود :

PrintWriter file = new PrintWriter(file_name);
while(scan.hasNextLine())
file.write(scan.nextLine());

لكن كلامك نبهني الى ان القصور في كودي هو ان هذه الاوامر تحفظ الملفات النصية لا ملفات الصوت و الصور ... و للذلك لاحظت انكي استخدمتي في كودك :

FileInputStream fis = new FileInputStream (url.toString());	   
FileOutputStream fos = new FileOutputStream("c:\\file_name");

(مع ملاحظتي انه لا يجدر بنا وضع رمز القرص سي او اي قرص اخر حتى يتم التخزين الى المسار الحالي مباشرة و ان toString لن ترجع لك اسم الملف)

و اظن انه بهذه الطريقة (استخدام الملفات الثنائية) فإننا نسير بتجاه ممتاز .. اما للخطأ فلم ادرسه حالياً ... دعي الامور الى الغد .. مع اني اتمنى ان تزيد المشاركات الى الموضوع و تكثر الاراء و الاقتراحات حتى يصبح الموضوع اجمل و اجمل

(اين shadooo و jfriend و البقية) :)

سلامي للجميع ...

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

للاسف ... طبقنا هذه الدروس ولكن المحصلة النهائية للدرس الثاني تساوي صفراً ... اي لم افهم منها شيء..

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم جميعاً ...

لا ادري ما المشكلة اخي Jsp .. لكن اقرأ اكثر من المرة .. الموضوع روعة و لن تجده في مكان اخر !!!!

متابعة لحلي السابق ... نرى ان القصور معي كان ان الملف لا ينسخ الملفات الثنائية الى المسار الحالي لانه يعتبرها ملفات نصية ..

المشكلة كانت ان الدالة openStream التابعة للكلاس URL ترجع تدفق من نوع InputStream الخاص بالملفات الثنائية ... و المشكلة هنا اننا لا نستطيع التعامل مع الكلاس FileInputStream للقراءة من الـ URL المفتوح لانه لا يستقبل باراميتر من نوع InputStream ..

عزيزتي الدكتورة ... لاحظي ذلك في كودك الذي اقرحتيه :

FileInputStream fis = new FileInputStream (url.toString());	   
FileOutputStream fos = new FileOutputStream("c:\\file_name");

مع ملاحظة ان toString لن ترجع اسم الملف و لا "c:\\file_name" سوف تنشيء الملف على المسار الحالي بل تنشيء ملف مجهول الامتداد اسمه file_name على القرص سي

و عليه فكرتي النهائية هي استخدام الكلاس BufferedInputStream و الذي ممكن ان يقرأ الثنائيات القادمة من الـ URL المطلوب و التعامل معها على اساس نوعها (صور او صوت او أي شيء)..

كودي النهائي سيكون كما يلي (و هو مجرب ... و جاهزة لأي تعليق إن شاء الله ) :

import java.net.URL;
import java.net.MalformedURLException;
import java.io.*;
import java.util.Scanner;

public class TestURL {

public static void main(String[] args) throws MalformedURLException, IOException
{
Scanner scan = new Scanner(System.in);
System.out.println ("Please enter your file's URL: ");

URL url = new URL(scan.nextLine());
String path = url.getFile();
String file_name = path.substring(path.lastIndexOf("/") + 1);
String file_extension = file_name.substring(file_name.lastIndexOf(".") + 1);

scan = new Scanner(url.openStream());

if (( file_extension.compareTo("java") == 0) || ( file_extension.compareTo("html") == 0) || ( file_extension.compareTo("txt") == 0) || ( file_extension.compareTo("cpp") == 0))
{
System.out.println ("-------------- Start printing the file on the screen -------------");
while(scan.hasNextLine())
System.out.println (scan.nextLine());
System.out.println ("-------------- End printing the file on the screen -------------");
}

else
{
BufferedInputStream from_url = new BufferedInputStream(url.openStream());
FileOutputStream to_file = new FileOutputStream(file_name);
int portion;
while(( portion = from_url.read() ) != -1)
to_file.write(portion);

from_url.close();
to_file.close();

System.out.println ("-------------- End printing the file to an external file -------------");
}
}
}

سلامي ... مع تكرار الشكر للأخ المتميز رومنسي

تم تعديل بواسطه بنت اليمن
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أحب أشكركم على الردود والحلول الرائعه ، ونظرا لأني مشغول حاليا ، قمت بحفظ جميع الردود وسأرد عليها غدا بحوله تعالى ...

بالنسبه لطريقه الحفظ في ملف في الجهاز ، يجب أن تكون على شكل Byte Stream ، لأن الناتج من url.openStream كما ذكرت أخت بنت اليمن يكون Byte أيضا ، فذلك أن أتعامل مع ملف من نوع Byte وهو FileOutputStream .

بقى الخطوه الأخيره هو الحصول على أسم الملف مع الأمتداد من url ، ويمكن أستخدام أكثر من طريقه ، وان كان عمل StringTokenizer على المعامل Delemitter / هو أسهل طريق للحصول على الأسم مع الأمتداد .

StringTokenizer t = new StringTokenizer ( s , "/");

while ( s.hasMoreTokens() )
ext = s.nextToken();

الان ext يحتوي على الأسم والأمتداد ، وهنا أستطيع فتح الملف للكتابه بهذا الأسم .

سأفصل أكثر غدا ان شاء الله عندما أقرا الردود جميعها وأقوم بالتعليق على الحلول ، لكن ما ذكرته أعلاه مجرد hint بسيط لمن أراد بعضا من المساعده :) .

أعتذر أيضا عن نسيان الفقره الخاصه بـ URI ، وهي أعم من URL ، لكن لا تستطيع من خلالها جلب محتويات URI كما في URL ، أيضا URI يتميز عن URL بأنه يمكن التعامل مع أي برتوكول وحتى لو كان من أختراعك Tel , Phone واي برتوكول أخر .

سنتحدث عنه المره القادمه باذنه تعالى قبل أن نبدأ في كتابه المتصفح Browser .

شكرا لكم مره أخرى .

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

try {



URL u = new URL("http://www.arabteam2000.org/");



}



catch (MalformedURLException ex) {



System.err.println(ex);



}

هل من أحد يجيب على أسئلتي تجاه طريقة التركيب هذه

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

عنجد الله يعطيك الف عافية يا ملك المنتدا يا رومنسي

الصراحة كلو توب

بس ممكن طلب

بالنسبة للكود يلي يعطيك محتوا الصفحة من كود وهوا

// print URL Content on screen

import java.net.URL;
import java.net.MalformedURLException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Demo
{
public static void main (String args[])
{
if ( args.length > 0 )
{
try
{
URL u = new URL (args[0]);

BufferedReader br = new BufferedReader(
new InputStreamReader( u.openStream() ) );

String content = "";

while ( ( content=br.readLine()) != null )
System.out.println( content );

}
catch ( MalformedURLException e)
{
String s = args[0].substring(0,args[0].indexOf(':'));
System.out.println(s + " is Not Supported");
}
catch ( IOException e)
{ e.printStackTrace(); }

}
else
System.out.println("Invalid Usage , Try : java Demo URL");
}
}

بيطلع كود html يعني كاني عم بطلب الكود من المتصفح

يا ترا فيني اخذ كود php يعني مو بس كود ال html حتى ال php اذا كانت صفحات ديناميكية

بتمنا ما تنسوني بالحل لطلبي

وبتمنا تكميل هالدروووس لا نها رووووووووووووووووووووعة

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

الدرس الأول يدل على أنك متمكن في هذا المجال يا أخ romansy

وأنا معك Step by Step

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بيطلع كود html يعني كاني عم بطلب الكود من المتصفح
يا ترا فيني اخذ كود PHP يعني مو بس كود ال html حتى ال PHP اذا كانت صفحات ديناميكية

حياك shadooo ... و من التجربة نعم بيطلع معك كود php و محتويات اي ملف مهما كان نوعه ...

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أهلا مجددا ،

بالنسبه لكودك أختى بنت اليمن فهو صحيح تماما ما شاء الله عليك . أما أختى د.sara فكانت مشكلتك هو أنك أن فتحتي ملف لقرائه المحتويات الناتجه من url.openStream ، وهذا خطأ ، حيث عليك أن تقرأي من هذا الStream باستخدام أي كلاس خاص بالقرائه من Bytes Stream مثل InputStream أو DataInputStream أو كما فعلت بنت اليمن وهي BufferedInputStream .

أتمنى أن تكون وضحت مشكلتك وطريقه حلها ...

بالنسبه لك أخي شادوو ، فكما ذكرت لك بنت اليمن ، هي openStream تجيب لك المحتويات على شكل Raw Data أي بيانات مرمزه أن صح التعبير ، وفي حالت كانت صفحه عاديه سواء html او php أو حتى asp ففي النهايه الناتج هو كود الصفحه ، واذا كان الملف هو صوره أم ملف mp3 فالناتج هو البيانات الثنائيه لهذا الملف Binary Data .

أخي Jsp ، بالنسبه لسؤالك والكود الذي وضعته ، فكل ما في الأمر أننا أنشأنا URL بهذا الString الذي مررته ، عن طريق هذا الURL تستطيع بعدها جلب محتويات الURL وعرضها لديك ، أو حتى ارسال بيانات لتلك الجهه (سوف نتناول جزئيه الأرسال فيما بعد) .

أما بالنسبه لعدم فهم محتوى الدروس ، فهذا أحتمال وارد، حيث نحن الى الان نقوم بعرض الكلاسات والدوال الرئيسيه المستخدمه ووظيفه كل داله ، بعدها عندما نجمع كميه من هذه المعلومات البسيطه سوف نستطيع عمل أي برنامج تريده في هذا المجال ، أحتمال أخر حيث أني مبتدئ جدا وأحتمال لم أوضح الدروس بالصوره المطلوبه ، ولكن بمشاركتم والتناقش في كل صغيره وكبيره يمكننا ان نتحسن ونتقدم الى الأمام بشكل أكبر .

حاليا كان مفترض أن نكمل في موضوع متصفح الأنترنت ونبدأ في كتابه برنامج بسيط ، لكني فضلت الأجابه على سؤال أختي الدكتوره ، وأحب أن أشكرها على هذا السؤال لأني تعلمت عده أشياء عن URI لم أكن أعلمها . فلذلك موضوع اليوم هو URI والموضوع القادم بعد يومين أو ثلاثه ان شاء الله نبدأ في الـ Browser .

( لا أحد يسألني مره تانيه :D :D ) .

-أمزح طبعا-

:lol:

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم ورحمه الله وبركاته ،

نكمل ما توقفنا فيه المره السابقه وهو موضوع الـ URI ، وكما ذكرنا أن URI هو أعم من URL ، والفرق الرئيسي بينهم هو أن الـ URL يستخدم في حال أردنا أن نسترجع محتويات الـ URL (مثلا باستخدام الداله openStream ) ، بينما في الـ URI لا نستطيع عرض المحتويات ولكن فقط عمل Splitt للـ URI أي عمل Parsing .

طبعا نحن يمكننا عمل Parsing لـ URL وذلك باستخدام الداول التي ذكرناها في الدرس الماضي (مثل getFile و getRef ) ، ولكن في الحقيقه هناك عده عيوب في Parsing الـ URL وهي أنه أولا يجب أن يتعرف الـ VM على الـ URL (والا لن يستطيع انشائه وسوف ينفذ MalformedURLException ) ، وفي حال أحتجت أن أتعامل مع برتوكول معين لا يستطيع الـ VM التعرف عليه فلا توجد أي طريقه للتعامل معه . لذلك هنا يجب أن نستخدم URI وهو يمكننا من أن نتعامل مع أي برتوكول ، اضافه الى توفر العديد من دوال الـ Parsing للـ URI . وأغلب المعايير مثل XML تتعامل مع URI كما قرأت .

فرق أخر بين URL و URI وهو أن لعمل URL يجب أن أكتب المسار كامل Absoulte path بدأ من البرتوكول ، وفي حال لم أكتب البرتوكول سوف ينفذ الـ MalformedURLException ، أما في URI وكما ذكرنا أن لا توجد مشكله في حال كتبنا برتوكول لا يتعرف عليه VM لذا يمكن تجاهله وهنا يكون المسار نسبي Relative Path كما سنرى بعد قليل .

في موضوعنا اليوم سنتناول :

- كيفيه انشاء URI

- كيفيه عمل Splitt أو Parsing للـ URI

كيفيه أنشاء URI :

--------------------

يمكننا أنشاء URI باستخدام أحد هذه الدوال :

public URI(String uri) throws URISyntaxException
public URI(String scheme, String schemeSpecificPart, String fragment) throws URISyntaxException
public URI(String scheme, String host, String path, String fragment) throws URISyntaxException
public URI(String scheme, String authority, String path, String query, String fragment) throws URISyntaxException
public URI(String scheme, String userInfo, String host, int port, String path, String query, String fragment) throws URISyntaxException
public static URI create(String uri)

داله البناء الأولى :

public URI(String uri) throws URISyntaxException

هنا نستطيع أنشاء URI عن طريق تمرير String لداله البناء هذه ، وكما نلاحظ أن هذه الداله (وباقي دوال البناء أيضا) تولد Exception من نوع Checked لذلك يجب التعامل معه . يحصل هذا الـ Exception اذا تمت كتابه الString بشكل خاطي ، مثلا تم نسيان علامه ( : ) بعد اسم البرتوكول ، تذكر ان في URI لا يهمه نوعيه البرتوكول المستخدم .

مثال :

try
{
URI mobile = new URI("Mobile:0911119415");
URI web = new URI("http://www.xml.com/pub/a/2003/09/17/stax.html#id=_hbc");
URI book = new URI("urn:isbn:1-565-92870-9");
}
catch ( URISyntaxException e)
{ System.out.println("Error in Syntax of URI !"); }

داله البناء الثانيه :

public URI(String scheme, String schemeSpecificPart, String fragment) throws URISyntaxException

وهي تستخدم في الغالب لـ nonhierarchical URIs مثل tel أو phone أو أي برتوكول تعرفه أنت ، وأغلب البرتوكولات التي يتعرف عليها VM هي hierarchical .

بالنسبه للـ scheme فهي البرتوكول المستخدم ، ويمكن استخدام اي برتوكول http , ftp أو حتى tel , phone وكل ما تريد ، ويمكن أن ترسل هنا null للدلاله على أن المسار سوف يكون نسبي Relative .

أما الـ

schemeSpecificPart فهي تكون على حسب البرتوكول ، فاذا كان http فسوف يكون مسار للموقع ، واذا كان tel فيكون رقم ما (أو اي بيانات أخرى) . طبعا لا يشترط هنا أن تكون البيانات من نوع معين ، فمثلا في الـ http اذا كان الـ schemeSpecificPart له هو رقم ما فلا توجد مشكله .أيضا يمكن كتابه هذا الجزء بأيه أحرف حتى لو كانت غير non ASCII باختصار هذا الجزء لا يولد أي Exception .

أما fragment فهي الجزء الأخير ، وهي تكون مثلا ref اذا كان uri عباره عن site ما . ويمكن أن تكون null للدلاله على عدم وجود fragment .

مثال :

try
{
URI absolute = new URI("http", "//www.arabteam2000.org" , null);
URI relative = new URI(null, "/java/index.shtml", "today");
}
catch ( URISyntaxException e)
{ System.out.println("Error in Syntax of URI !"); }

المخرج لو تمت ترجمه هذه الجزئيه :

http://www.arabteam2000.org

/java/index.shtml#today

داله البناء الثالثه :

public URI(String scheme, String host, String path, String fragment) throws URISyntaxException

وهي تستخدم مع الـ hierarchical URIs مثل Ftp , Http . ويكون الHost هنا اسم الموقع ، وpath المسار .

مثال :

try
{
URI today= new URI("http:", "www.arabteam200.org", "/java/index.html", "today");
System.out.println(today);

}
catch ( URISyntaxException e)
{ System.out.println("Error in Syntax of URI !"); }

المخرج :

http://www.arabteam200.org/java/index.html#today

لاحظ أن في حال لم تستخدم بروتوكول اي وضعت null في الـ Scheme (اي كان مسار مطلق Absoulte ) ، فيجب أن يبدأ المسار Path بعلامه / والا سيحصل URISyntaxException .

داله البناء الرابعه :

public URI(String scheme, String authority, String path, String query, String fragment) throws URISyntaxException

وهي نفس السابقه تتعامل مع hierarchical URIs ولكن تم زياده جزء خاص بكتابه الأستعلام Query .

try
{
URI today= new URI("http", "www.arabteam200.org", "/java/index.html","id = romansy wajdy", "today");
System.out.println(today);

}
catch ( URISyntaxException e)
{ System.out.println("Error in Syntax of URI !"); }

المخرج :

http://www.arabteam200.org/java/index.html?id%20=%20romansy%20wajdy#today

داله البناء الخامسه :

public URI(String scheme, String userInfo, String host, int port, String path, String query, String fragment) throws URISyntaxException

وهي أيضا تعمل بنفس عمل السابقه ، ولكن تم تقسيم host الى userInfo و host و port (وقد تحدثنا عن هذه الأجزاء الدرس الماضي ) .

try
{
URI today= new URI("ftp", "WajdyEssam:anyPassword", "ftp.arabteam2000",
21 , "/java/index.html", null, "today");
System.out.println(today);

}
catch ( URISyntaxException e)
{ System.out.println("Error in Syntax of URI !"); }

المخرج :

ftp://WajdyEssam:[email protected]:21/java/index.html#today

الداله الأخيره لعمل URI :

public static URI create(String uri)

وهي ليست داله بناء ، ولكنها داله عاديه static تقوم بعمل URI ولا تولد Exception ، وعملها بالضبط هو نفس عمل الداله الأولى .

- كيفيه عمل Splitt أو Parsing للـ URI

----------------------------------------------

كما لاحظنا قبل قليل عندما أنشأنا URI أن هناك دوال بناء خاصه لانشاء hierarchical URI (وهي تقريبا جميع دوال البناء السابقه ما عدا الأولى والأخيره ) ، والدوال الأخرى لانشاء non hierarchical URI (وهي تسمى opaque ).

اذا hierarchical URI هي التي تحتوي على مسار واسم host وبورت وما الى ذلك (مثل ftp , http URL ) .

أما opaque وهي التي تتكون من scheme و scheme-specific-part و fragment

وكما ذكرنا أن URI يمكن أن يحتوي على non Ascii char وحروف لها معنى خاص عند الترجمه ، فانه يمكن أن نرجع البيانات التي في URI اما بصورتها الأصليه Raw ، أو بصورتها بعد عمليه Encoded . مثلا لو كان يحتوي URI على %3C فلو أرجعناه بشكل Raw فسوف يكون كما هو %3C ، أما لو أرجعنا بشكل عادي فسوف يرجعه بشكله بعد الترجمه وهو علامه > .

وهذه أول مجموعه من الدوال ، وهي خاصه لURI من نوع opaque :

public String getScheme( )

public String getSchemeSpecificPart( )
public String getRawSchemeSpecificPart( )

public String getFragment( )
public String getRawFragment( )

(لاحظ لا توجد getRawScheme لأن البرتوكول يجب أن يكتب بشكل صحيح أي يحتوي على حروف Ascii فقط ) .

دوال أخرى وهي خاصه لارجاع معلومات الـ URI من نوع hierarchical :

public String getAuthority( )
public String getRawAuthority( )

public String getFragment( )
public String getRawFragment( )

public String getHost( )

public String getPath( )
public String getRawPath( )

public String getPort( )

public String getQuery( )
public String getRawQuery( )

public String getUserInfo( )
public String getRawUserInfo( )

(نفس الملاحظه السابقه وهي لا توجد دوال لاسترجاع بورت و host على شكل raw لأننا لا يمكن أن نضع فيهم علامه % ).

أيضا هذه مجموعه من الدوال للأختبار :

public boolean isOpaque( )
public boolean isAbsolute( )

الأولى تختبر هل الـ URI تتبع للنوع الأول opaque أم للثاني hierarchical .

الداله الثانيه تختبر هل الـ URI هو مطلق أم نسبي ، تذكر أن URI يكون نسبي اذا كان البرتوكول Scheme هي null .

أخر داله موجوده في URI :

public URI parseServerAuthority( )  throws URISyntaxException

وهي ترجع URI أخر (لا تغير في URI الحالي ، لأن الكلاس URI أصلا هو Immutable ) ، وهي تستخدم لفصل جزئيه الـ Authority الى اسم host و port و path .

وفي حال لم تستطيع الداله عمل parse فأنها تنفذ الـURISyntaxException .

مثال شامل لهذه الدوال :

// Parse  URI Content

import java.net.URI;
import java.net.URISyntaxException;

public class Demo
{
public static void main (String args[])
{
if ( args.length > 0 )
{
try
{
URI uri = new URI( args[0] );

System.out.println("URI : " + uri );

if ( uri.isOpaque() )
{
System.out.println("Scheme : " +
uri.getScheme() );

System.out.println("scheme Specific Part : " +
uri.getSchemeSpecificPart() );

System.out.println("Framgemtn : " +
uri.getFragment() );
}
else
{
System.out.println("This is hierarchical URI");
System.out.println("Scheme : " + uri.getScheme() );

try
{
uri = uri.parseServerAuthority( );

System.out.println("The host is " + uri.getUserInfo( ));
System.out.println("The user info is " + uri.getUserInfo( ));
System.out.println("The port is " + uri.getPort( ));

}

catch (URISyntaxException ex)
{
System.out.println("The authority is " + uri.getAuthority( ));
}

System.out.println("The path is " + uri.getPath( ));
System.out.println("The query string is " + uri.getQuery( ));
System.out.println("The fragment ID is " + uri.getFragment( ));
}
}
catch ( URISyntaxException e)
{
System.out.println(args[0] + " is not URI ");
}
}
else
System.out.println("Error , Usage : java Demo URI ");
}
}

التنفيذ مع المخرجات :

java Demo Tel:0911119415

URI : Tel:0911119415

Scheme : Tel

scheme Specific Part : 0911119415

Framgemtn : null

java Demo http://www.arabteam2000.com

URI : http://www.arabteam2000.com

This is hierarchical URI

Scheme : http

The host is null

The user info is null

The port is -1

The path is

The query string is null

The fragment ID is null

java Demo ftp://Wajdy:Essam/java

URI : ftp://Wajdy:Essam/java

This is hierarchical URI

Scheme : ftp

The authority is Wajdy:Essam

The path is /java

The query string is null

The fragment ID is null

java Demo http://www.xml.com/pub/a/2003/09/17/stax.html#id=_hbc

URI : http://www.xml.com/pub/a/2003/09/17/stax.html#id=_hbc

This is hierarchical URI

Scheme : http

The host is null

The user info is null

The port is -1

The path is /pub/a/2003/09/17/stax.html

The query string is null

The fragment ID is id=_hbc

أخر مجموعه من الدوال نتطرق لها هنا ، وهي خاص للتحويل من الشكل النسبي الى المطلق :

public URI resolve(URI uri)
public URI resolve(String uri)
public URI relativize(URI uri)

الداله الأولى :

public URI resolve(URI uri)

تقوم بالدمج بين الuri الحالي ، مع الـ uri المرسل ، وترجع الناتج uri ( أو بالأصح تحصل على المسار المطلق) .

مثال :

URI absolute = new URI("http://www.example.com/");
URI relative = new URI("images/logo.png");
URI resolved = absolute.resolve(relative);

الان قيمه resolved هي : http://www.example.com/images/logo.png

مثال أخر :

URI top = new URI("javafaq/books/");
URI relative = new URI("jnp3/examples/07/index.html");

URI resolved = top.resolve(relative);

الان قيمه resolved هي : javafaq/books/jnp3/examples/07/index.html

الداله الثانيه :

public URI resolve(String uri)

وهي نفس الداله الأولى ، ولكن تستقبل String بدلا من uri .

مثال :

URI absolute = new URI("http://www.example.com/");

URI resolved = absolute.resolve("images/logo.png");

الان قيمه resolved هي : http://www.example.com/images/logo.png

الداله الثالثه والأخيره هنا :

public URI relativize(URI uri)

وهي العمليه العكسيه للداله السابقه ، أي تحصل على المسار النسبي من المطلق .

URI absolute = new URI("http://www.example.com/images/logo.png");

URI top = new URI("http://www.example.com/");

URI relative = top.relativize(absolute);

الان قيمه relative هي : images/logo.png .

الى هنا نتوقف ، ونكمل المره القادمه مع الـ Broswer باذن الله ، الى ذلك الوقت يمكنكم حل اللغز البسيط التالي :) :

public class BrowserTest {

public static void main(String[] args) {

System.out.print("iexplore:");

http://www.google.com;

System.out.println(":maximize");

}

}

السؤال هنا ، ماالذي حصل بالضبط في البرنامج أعلاه ، وكيف يمكن كتابه http://www.google.com من غير الحاجه الى عمل URI أو URL ؟

- يفضل عدم الأستعانه بالمترجم أو حتى أي محرر نصوص-

تم تعديل بواسطه romansy
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

آسف للمقاطعة ..

اريد فقط توجيه شكر كبير... لان المنتدى بحاجة لدروس تغطي جميع الاحتياجات و هذا الدرس من اهمها

سوف اضع رابط له بالمواضيع المهمة ان شاء الله عند انتهاءه

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

جزاك الله خير الجزاء اخي رومنسي ... و رغم إنشغالي تماماً هذه الايام بإختباراتي ، لم اتمالك نفسي من متابعة الدروس هنا ..

الامر مشوق .... و في إنتظار الدسم إن شاء الله ...

بنسبة لسؤال الموضوع .. طبعاً هو محير ... لكن .. بعد ما ركزت فيه خطر لي شيء مضحك جداً جداً ...

و هو التالي :

ان الامر

System.out.print("iexplore:");

سوف يفتح المتصفح internet explore بقدرة قادر :D ثم يطلب الصفحة http://www.google.com;

بعدها (و بقدرة قادر طبعاً) ... يحصل للصفحة تكبير !!! بالامر

System.out.println(":maximize");

طبعاً الامر كله نكته :) و اتوقع السؤال له علاقة بالموضوع القادم ...

و لا اخفيك اني جربت الكود ... و هذا ما ظهر لي:

post-20471-1205316612_thumb.jpg

و هناك شيء اخر ... و هو ، و حسب ما فهمت من الدرس ، اننا لا نستخدم نقطتين فوق بعض ( : ) بعد اسم البرتوكول الا في النوع الاول من دوال البناء عند عدم تمرير scheme... و اظن انك اضفته في احد المقاطع .. فقط اريد تفسير بسيط ..

وهي تستخدم مع الـ hierarchical URIs مثل Ftp , Http . ويكون الHost هنا اسم الموقع ، وpath المسار .

مثال :

كودtry
{
URI today= new URI("http:", "www.arabteam200.org", "/java/index.html", "today");
System.out.println(today);

}
catch ( URISyntaxException e)
{ System.out.println("Error in Syntax of URI !"); }

تم تعديل بواسطه بنت اليمن
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

فهمك صحيح أختي بنت اليمن ، وهذا يدل على حسن المتابعه ، وعلى ما يبدوا أنه سيطبع

http:://www.arabteam2000.com/java/index.html#today

لذلك المفترض أن ندخل البرتوكول فقط . شكرا على التنبيه .

بالنسبه الى السؤال ، فقط أريد أن أعرف السطر ما بين جملتين الطباعه ، ماهي وظيفته ؟ ولماذا لم يشتكي منه المترجم ؟

وبما أنك أرفقت صوره للسطر ،فالأجابه انكشفت :) ، فكما هو واضح أنه تعليق عادي Comment .

أما http: فهي عباره عن Label ، وهو يستخدم في جافا عندما نقول break point اي اذهب الى point (مشابه لفكره goto ).

يعني السطر ليس له علاقه لا بـ URL أو URI ، كل ما في الأمر مجرد Label عادي بس أسمه مميز :) ، وتعليق عادي على شكل اسم موقع :)

ftp : // no site available

:D :D :D

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

جميل جداً :D

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .