بعض الاوامر في انشاء برنامج لمحاكات برنامج FTp من قبل الزبون
لانشاء مقبس اتصال مع مخدم ftp يجب علينا بفتح مجرى دخل وخرج لتمرير اسم المستخدم وكلمة المرور
ومن ثم يستطيع المستخدم ارسال اوامر ftp الى المخدم كي يتم تنفيذها ثم تتم قراءة نتيجة تنفيذ الامر .
1- نفتح اتصال مع مخدم ftp وذلك من خلال تحديد عنوان المخدم ورقم المنفذ بالتعليمة التالية
Socket socket =new Socket (address,port);
حيث ان address يمثل عنوان الاي بي و port يمثل المنفذ المراد الاتصال به على ذلك المخدم
عملا ان الصف socket يقدم لنا مشيدات او انه صف بمثابة صف بناء نمرر برامترات عليه

2- بعد ما قمنا بتاسيس اتصال يجب علينا ان نفتح مجرى دخل و مجرى خرج على الشكل التالي
كود
BufferedReader br=new BufferedReader(new InputStreamReader(Socket.getInputStream());
BufferedWriter  bw=new BufferedWriter(new OutputStreamWriter(Socket.getOutputStream());


الجدير بالذكر هنا ينصح باستخدام المجاري من نوع buffered لكونها اسرع من غيرها

الان اصبح كل شئ جاهز ويمكننا الكتابة والقرائة من المخدم بواسطة طرائق الكتابة والقراءة
3- علينا الا ننسى اغلاق جميع المجاري وكذلك اغلاق المقبس على النحو :
اتوجه بالشكر للاخ الذي نبهني على تسكيرالسوكيت ...........
كود
br.close();//close object read
bw.close();//close object write
socket.close();//close object socket

اما الان اليكم كود البرنامج كامل
كود
import java.net.*;
import java.io.*;
public class FTPClient
{
    Socket socket;//object of socket
    BufferedReader br;//object of read
    BufferedWriter bw;//object of write
    public static void main(String args[])throws IOException
    {
        FTPClient ftp =new FTPClient("127.0.0.1");
        ftp.getReply();
        ftp.sendCommand("user "+"anonymous");
        ftp.getReply();
        ftp.sendCommand("pass"+"anonymous");
        ftp.getReply();
        String com="";
        while (!com.equalsIgnoreCase("quit"))
        {
            System.out.println("enter your commands ,or enter Quit to exit");
            BufferedReader keyboard =new BufferedReader(new InputStreamReader(System.in));
            com=keyboard.readLine();
            ftp.sendCommand(com);
            ftp.getReply();
            System.out.println("==================");
            
        }
        ftp.Close();
    }
    public FTPClient(String address)
    {
        try{
            socket =new Socket(address,21);
            System.out.println("connection is established");
            br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
            bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        }
        catch(Exception e)
        {
            System.out.println(e.toString());
            
        }
        }
        public void Close() throws IOException
        {
            br.close();
            bw.close();
            socket.close();
            
                
        }
        public void getReply()throws IOException
        {
            int ch=0;
            String line="";
            while(br.ready())
            {
                line=br.readLine();
                System.out.println(line);
                
            }
        }
        public void sendCommand (String command )throws IOException
        {
            bw.write(command);
            bw.newLine();
            bw.flush();
        }
        
    }


الان سوف نقوم بمناقشة البرنامج السابق ...................
اولى المشاكل التي ستواجهنا بالبرنامج السابق ....مشكلة في قراءة البيانات من المقبس
اذا قمت بتجربةهذا البرنامج فانه بلا شك سيعمل بصورة غير طبيعية والسب يعود بقراءة المعلومات من المقبس
اذ قمت باستبدال الحلقة التالية بالبرنامج
كود
while(br.ready())
{
line=br.readLine();
System.out.println(line);
                
}

بالحلقة التالية

كود
While ((line=br.readLine())!=null)
{
System.out.println(line);
}

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


حيث ان الطريقة ready تعيد قيمتين false & true حيث انه احيانا يعتبر المجرى فارغ وينتظر اوامر دخل بيانات راقب البرنامج ونفذه سترا هذا الشي ينفذ حيث يتم تفحص الطريقة ready كل مرتين او ثلاثة
حيث انه لا يدخل بيانات لفترا ميعينة .......... فما الحل؟؟؟؟
الحل هوا بانه نلغي القيمة false التي تؤدي توقف البرنامج لدقائق او توقف الاخراج وذلك بتفحص الطريقةوالنص البرمجي التالي يحل هذه المشكلة على الشكل التالي حيث يقوم بتفحص الطريقة ready اذا كانت false ينضر الى المحرف الاخير الذي تمت قرائته فاذا كان /n فانه ينتضر ثلاث ثواني "تستطيع وضع المدة التي تريد" ومن ثم يفحص المجرى مرى اخرى فاذا كانت النتيجة true فانه سيعود الى متابعة القراءة من المجرى والا فانه سيخرج من الحلقة .......اليك النص البرمجي
كود
while (ch!=1)    {
            if(br.ready())
            {
            ch=br.read();
            System.out.println((char)ch);
            }
            else
            
            if(ch==10 &!br.ready())
            {
            try{
            Thread.sleep(3000);//can be change time "this 3 second "
            }
            catch (InterruptedException e){
            }
            if(!br.ready())
            {
            System.out.println("break");
            break;
            }
            else
            System.out.println("reconnected.....");
            }
            }


والبرنامج كامل الان بين يديكم
على التالي
كود
import java.net.*;
import java.io.*;
public class FTPClient
{
    Socket socket;//object of socket
    BufferedReader br;//object of read
    BufferedWriter bw;//object of write
    public static void main(String args[])throws IOException
    {
        FTPClient ftp =new FTPClient("127.0.0.1");
        ftp.getReply();
        ftp.sendCommand("user "+"anonymous");
        ftp.getReply();
        ftp.sendCommand("pass"+"anonymous");
        ftp.getReply();
        String com="";
        while (!com.equalsIgnoreCase("quit"))
        {
            System.out.println("enter your commands ,or enter Quit to exit");
            BufferedReader keyboard =new BufferedReader(new InputStreamReader(System.in));
            com=keyboard.readLine();
            ftp.sendCommand(com);
            ftp.getReply();
            System.out.println("==================");
            
        }
        ftp.Close();
    }
    public FTPClient(String address)
    {
        try{
            socket =new Socket(address,21);
            System.out.println("connection is established");
            br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
            bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        }
        catch(Exception e)
        {
            System.out.println(e.toString());
            
        }
        }
        public void Close() throws IOException
        {
            br.close();
            bw.close();
            socket.close();
            
                
        }
        public void getReply()throws IOException
        {
            int ch=0;
            String line="";
            /*while(br.ready())
            {
                line=br.readLine();
                System.out.println(line);
                
            }*/
                while (ch!=1)    {
            if(br.ready())
            {
            ch=br.read();
            System.out.println((char)ch);
            }
            else
            
            if(ch==10 &!br.ready())
            {
            try{
            Thread.sleep(300);
            }
            catch (InterruptedException e){
            }
            if(!br.ready())
            {
            System.out.println("break");
            break;
            }
            else
            System.out.println("reconnected.....");
            }
            }
        }
        public void sendCommand (String command )throws IOException
        {
            bw.write(command);
            bw.newLine();
            bw.flush();
        }
        
    }



ارجو منكم ايجاد الثغرات في برنامجي والاخطاء البرمجية
لكي تساعدوني على اتمام مهمتي

والنقد في تحليلي المنطقي
وشكرا............