المساعدة - البحث - قائمة الأعضاء - التقويم
نسخة كاملة: Start Network Programming In Java
برمجة - شبكات - كمبيوتر - منتديات الفريق العربي للبرمجة > منتديات لغات البرمجة العام > منتدى مبرمجي لغة جافا JAVA
صفحات: 1, 2
Wajdy Essam


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

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

أهلا 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 وليس العنوان .

تحياتي .
علاء الصالحي
لي عودة بإذن الله
تحياتي
بنت اليمن
السلام عليكم ...

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

حاولت احل التمرين ... و وصلت الى طريقة (نص كم) تعتمد على استخدام 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 wink_smile.gif
ابو سعود الفرنسي
أولاً ِاشكرك على هذا المجهود الرائع ... ووفقك الله

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

import java.util.Scanner

فالجافا لا تعرفها ... فما العمل ... وهل استطيع ان اجد بدائل لهذه الطريقة ..؟
ابو سعود الفرنسي
إقتباس(dr_sara @ Mar 3 2008, 06:59 AM) *
السلام عليكم ورحمة الله وبركاتة
اخى الفاضل اكيد انت تعمل على jdk قديم مثل jdk3 اذا استخدمت --jdk5-or -jdk 6 بتجدها تعمل ان شاء الله فقط الاصدار لم يوجد بة هذا الكلاس
بالتوفيق ان شاء الله


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

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

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

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


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

و بالنسبة للـ Exception اذا رجعتي الى كودي بتلاحظي اني عملي throws بعد الدالة main ، لاحظي :
كود
public static void main(String[] args) throws UnknownHostException


سلامي
shadooo
إقتباس(dr_sara @ Mar 2 2008, 10:04 PM) *
السلام عليكم ورحمة الله وبركاتة
اذا هذا هو البرنامج بعد التعديل ارجو يكون صحيح هذة المرة
كود
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 طبعا " كما بيعطيني الاي بي
يا هالترا في طريقة تمنع هذا وتسمح بهذا او بالعكس .....
مشكورين على احب اللفاتات في المنتدا الى قلبي ....
بنت اليمن
و الآن اليكم هذا الكود ... هو خليط من مجموعة افكار و جدتها ( مجرب و بسيط وحلو عشان الحبايب regular_smile.gif )

كود
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);

               }
                   

    }
}
Wajdy Essam

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

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

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

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

نكمل ما توقفنا فيه المره السابقه وهو موضوع الـ 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://admin@www.blackstar.com:8080/

هنا :
protocol هو http
authority هو admin@www.blackstar.com: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:Essam@138.247121.61:21000/c%3a/

URL : ftp://Wajdy:Essam@138.247.121.61: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:Essam@138.247.121.61: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 لأني أعمل على هذا السيرفر .

الى اللقاء.
regular_smile.gif
بنت اليمن
الموضوع اليوم جميل جداً ... جزاك الله كل الخير

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

كود
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();
        }
    }
}


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

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

إقتباس
هنا لن تكون هناك مخرجات ، لكننا سوف نحمل ملف 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 و البقية) regular_smile.gif

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

لا ادري ما المشكلة اخي 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 -------------");
        }
    }
}


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

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

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

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

كود
StringTokenizer t = new StringTokenizer ( s , "/");

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


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

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

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

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

شكرا لكم مره أخرى .
ابو سعود الفرنسي
CODE
try {



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



}



catch (MalformedURLException ex) {



System.err.println(ex);



}



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

shadooo
عنجد الله يعطيك الف عافية يا ملك المنتدا يا رومنسي
الصراحة كلو توب
بس ممكن طلب
بالنسبة للكود يلي يعطيك محتوا الصفحة من كود وهوا
كود
// 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 اذا كانت صفحات ديناميكية
بتمنا ما تنسوني بالحل لطلبي
وبتمنا تكميل هالدروووس لا نها رووووووووووووووووووووعة
هــــ برمجة ــــاوي
الدرس الأول يدل على أنك متمكن في هذا المجال يا أخ romansy
وأنا معك Step by Step
بنت اليمن
كود
بيطلع كود html يعني كاني عم بطلب الكود من المتصفح
يا ترا فيني اخذ كود PHP يعني مو بس كود ال html حتى ال PHP اذا كانت صفحات ديناميكية


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

أهلا مجددا ،

بالنسبه لكودك أختى بنت اليمن فهو صحيح تماما ما شاء الله عليك . أما أختى د.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 .

( لا أحد يسألني مره تانيه biggrin.gif biggrin.gif ) .
-أمزح طبعا-

laugh.gif
Wajdy Essam

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

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

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