ونڊوز ڪلائنٽ-سرور يوٽيلٽيز جي ڪارڪردگي سان سافٽ ويئر لکڻ، حصو 01

پريتم.

اڄ آئون ڪلائنٽ-سرور ايپليڪيشنن کي لکڻ جي عمل کي ڏسڻ چاهيندس جيڪي معياري ونڊوز يوٽيلٽيز جا ڪم سرانجام ڏين ٿيون، جيئن ته خالص جاوا ۾ Telnet, TFTP, et cetera, et cetera. اهو واضح آهي ته مان ڪجهه به نئون نه آڻيندس - اهي سڀئي افاديت هڪ سال کان وڌيڪ ڪاميابيء سان ڪم ڪري رهيا آهن، پر مون کي يقين آهي ته هر ڪنهن کي خبر ناهي ته هود هيٺ ڇا ٿي رهيو آهي.

اھو اھو آھي جيڪو ڪٽ جي ھيٺان بحث ڪيو ويندو.

هن آرٽيڪل ۾، انهي کي ڇڪڻ نه ڏيڻ لاء، عام معلومات کان علاوه، مان صرف ٽيل نيٽ سرور جي باري ۾ لکندس، پر هن وقت ٻين افاديت تي پڻ مواد آهي - اهو سلسلو جي ايندڙ حصن ۾ هوندو.

سڀ کان پهريان، توهان کي اهو ڄاڻڻ جي ضرورت آهي ته Telnet ڇا آهي، ان جي ڪهڙي ضرورت آهي، ۽ اهو ڇا لاء استعمال ڪيو وڃي ٿو. مان ذريعن جو لفظي حوالو نه ڏيندس (جيڪڏهن ضروري هجي ته، مان مضمون جي آخر ۾ موضوع تي مواد جي هڪ لنڪ ڳنڍيندس)، مان صرف اهو چوندس ته ٽيلنٽ ڊوائيس جي ڪمان لائن تائين ريموٽ رسائي فراهم ڪري ٿي. وڏي ۽ وڏي، هي آهي جتي ان جي ڪارڪردگي ختم ٿئي ٿي (مان جان بوجھ ڪري سرور جي بندرگاهن تائين رسائي جي باري ۾ خاموش رهي؛ انهي تي وڌيڪ بعد ۾). هن جو مطلب اهو آهي ته ان کي لاڳو ڪرڻ لاء، اسان کي ڪلائنٽ تي هڪ لڪير قبول ڪرڻ جي ضرورت آهي، ان کي سرور ڏانهن منتقل ڪرڻ جي ڪوشش ڪريو، ان کي ڪمانڊ لائن ڏانهن منتقل ڪرڻ جي ڪوشش ڪريو، ڪمانڊ لائن جواب پڙهو، جيڪڏهن ڪو آهي، ان کي واپس ڪلائنٽ ڏانهن منتقل ڪريو ۽ ان کي اسڪرين تي ڏيکاريو، يا، جيڪڏھن غلطيون، صارف کي خبر ڏيو ته ڪجھھ غلط آھي.

مٿين تي عمل ڪرڻ لاءِ، ان مطابق، اسان کي 2 ڪم ڪندڙ طبقن ۽ ڪجھ ٽيسٽ ڪلاس جي ضرورت آھي جنھن مان اسان سرور کي لانچ ڪنداسين ۽ جنھن ذريعي ڪلائنٽ ڪم ڪندو.
ان جي مطابق، هن وقت ايپليڪيشن جي جوڙجڪ ۾ شامل آهن:

  • Telnet ڪلائنٽ
  • TelnetClientTester
  • TelnetServer
  • TelnetServerTester

اچو ته انهن مان هر هڪ ذريعي وڃو:

Telnet ڪلائنٽ

هي سڀ طبقو ڪرڻ جي قابل هوندو آهي موصول ٿيل حڪمن کي موڪليو ۽ وصول ڪيل جواب ڏيکاريو. اضافي طور تي، توهان کي قابل ٿيڻ جي ضرورت آهي (جيئن مٿي ذڪر ڪيو ويو آهي) هڪ ريموٽ ڊوائيس جي بندرگاهن سان ڳنڍڻ ۽ ان کان ڌار ٿيڻ.

هن کي حاصل ڪرڻ لاء، هيٺين ڪمن تي عمل ڪيو ويو:

هڪ فنڪشن جيڪو ساکٽ ايڊريس کي دليل طور وٺي ٿو، ڪنيڪشن کولي ٿو ۽ ان پٽ ۽ آئوٽ اسٽريمز شروع ڪري ٿو (اسٽريم متغير مٿي بيان ڪيا ويا آهن، مڪمل ماخذ آرٽيڪل جي آخر ۾ آهن).

 public void run(String ip, int port)
    {
        try {
            Socket socket = new Socket(ip, port);
            InputStream sin = socket.getInputStream();
            OutputStream sout = socket.getOutputStream();
            Scanner keyboard = new Scanner(System.in);
            reader = new Thread(()->read(keyboard, sout));
            writer = new Thread(()->write(sin));
            reader.start();
            writer.start();
        }
        catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

ساڳئي فنڪشن کي اوور لوڊ ڪندي، ڊفالٽ پورٽ سان ڳنڍڻ - telnet لاءِ هي 23 آهي


    public void run(String ip)
    {
        run(ip, 23);
    }

فنڪشن ڪيبورڊ مان اکر پڙهي ٿو ۽ انھن کي ٻاھرين ساکٽ ڏانھن موڪلي ٿو - جيڪو عام آھي، لائن موڊ ۾، نه ڪي ڪردار موڊ:


    private void read(Scanner keyboard, OutputStream sout)
    {
        try {
            String input = new String();
            while (true) {
                input = keyboard.nextLine();
                for (char i : (input + " n").toCharArray())
                    sout.write(i);
            }
        }
        catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

فنڪشن ساکٽ مان ڊيٽا حاصل ڪري ٿو ۽ ان کي اسڪرين تي ڏيکاري ٿو


    private void write(InputStream sin)
    {
        try {
            int tmp;
            while (true){
                tmp = sin.read();
                System.out.print((char)tmp);
            }
        }
        catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

فنڪشن ڊيٽا جي استقبال ۽ ٽرانسميشن کي روڪي ٿو


    public void stop()
    {
        reader.stop();
        writer.stop();
    }
}

TelnetServer

ھن طبقي ۾ ھڪڙي ساکٽ مان ھڪڙي حڪم حاصل ڪرڻ، ان کي عمل ڪرڻ لاء موڪلڻ، ۽ حڪم کان جواب واپس ساکٽ ڏانھن موڪلڻ جي ڪارڪردگي آھي. پروگرام عمدي طور تي ان پٽ ڊيٽا کي چيڪ نٿو ڪري، ڇو ته پهرين، "باڪس ٿيل ٽيل نيٽ" ۾ پڻ سرور ڊسڪ کي فارميٽ ڪرڻ ممڪن آهي، ۽ ٻيو، هن مضمون ۾ سيڪيورٽي جو مسئلو اصول ۾ ختم ڪيو ويو آهي، ۽ اهو ئي سبب آهي ته اتي موجود ناهي. انڪرپشن يا SSL بابت هڪ لفظ.

هتي صرف 2 افعال آهن (انهن مان هڪ اوورلوڊ ٿيل آهي)، ۽ عام طور تي اهو هڪ تمام سٺو عمل ناهي، پر هن ڪم جي مقصدن لاء، مون کي مناسب لڳي ته هر شيء کي ڇڏي ڏيو جيئن اهو آهي.

 boolean isRunning = true;
    public void run(int port)    {

        (new Thread(()->{ try {
            ServerSocket ss = new ServerSocket(port); // создаем сокет сервера и привязываем его к вышеуказанному порту
            System.out.println("Port "+port+" is waiting for connections");

            Socket socket = ss.accept();
            System.out.println("Connected");
            System.out.println();

            // Берем входной и выходной потоки сокета, теперь можем получать и отсылать данные клиенту.
            InputStream sin = socket.getInputStream();
            OutputStream sout = socket.getOutputStream();

            Map<String, String> env = System.getenv();
            String wayToTemp = env.get("TEMP") + "tmp.txt";
            for (int i :("Connectednnr".toCharArray()))
                sout.write(i);
            sout.flush();

            String buffer = new String();
            while (isRunning) {

                int intReader = 0;
                while ((char) intReader != 'n') {
                    intReader = sin.read();
                    buffer += (char) intReader;
                }


                final String inputToSubThread = "cmd /c " + buffer.substring(0, buffer.length()-2) + " 2>&1";


                new Thread(()-> {
                    try {

                        Process p = Runtime.getRuntime().exec(inputToSubThread);
                        InputStream out = p.getInputStream();
                        Scanner fromProcess = new Scanner(out);
                        try {

                            while (fromProcess.hasNextLine()) {
                                String temp = fromProcess.nextLine();
                                System.out.println(temp);
                                for (char i : temp.toCharArray())
                                    sout.write(i);
                                sout.write('n');
                                sout.write('r');
                            }
                        }
                        catch (Exception e) {
                            String output = "Something gets wrong... Err code: "+ e.getStackTrace();
                            System.out.println(output);
                            for (char i : output.toCharArray())
                                sout.write(i);
                            sout.write('n');
                            sout.write('r');
                        }

                        p.getErrorStream().close();
                        p.getOutputStream().close();
                        p.getInputStream().close();
                        sout.flush();

                    }
                    catch (Exception e) {
                        System.out.println("Error: " + e.getMessage());
                    }
                }).start();
                System.out.println(buffer);
                buffer = "";

            }
        }
        catch(Exception x) {
            System.out.println(x.getMessage());
        }})).start();

    }

پروگرام سرور پورٽ کوليندو آهي، ان مان ڊيٽا پڙهي ٿو جيستائين اهو هڪ ڪمانڊ آخر ڪردار سان منهن نٿو ڏئي، ڪمانڊ کي نئين پروسيس ڏانهن منتقل ڪري ٿو، ۽ پروسيس کان ساکٽ ڏانهن ٻاھر موڪليو. هر شيءِ ڪلاشنڪوف اسالٽ رائفل وانگر سادو آهي.

انهي جي مطابق، هن فنڪشن لاء هڪ اوورلوڊ آهي ڊفالٽ پورٽ سان:

 public void run()
    {
        run(23);
    }

خير، ان جي مطابق، اهو فعل جيڪو سرور کي روڪي ٿو، اهو پڻ ننڍڙو آهي، اهو ابدي لوپ کي مداخلت ڪري ٿو، ان جي حالت جي ڀڃڪڙي ڪري ٿو.

    public void stop()
    {
        System.out.println("Server was stopped");
        this.isRunning = false;
    }

مان هتي ٽيسٽ ڪلاس نه ڏيندس، اهي هيٺ آهن - اهي سڀ ڪجهه ڪندا آهن عوامي طريقن جي ڪارڪردگي کي جانچڻ. هر شي گٽ تي آهي.

اختصار ڪرڻ لاء، شام جو هڪ ٻه ۾ توهان بنيادي ڪنسول افاديت جي آپريشن جي اصولن کي سمجهي سگهو ٿا. هاڻي، جڏهن اسان هڪ ريموٽ ڪمپيوٽر تي ٽيلينٽ ڪندا آهيون، اسان سمجهون ٿا ته ڇا ٿي رهيو آهي - جادو غائب ٿي ويو آهي)

تنهن ڪري، لنڪس:
سڀ ذريعا هتي هئا، آهن ۽ هوندا
Telnet جي باري ۾
Telnet بابت وڌيڪ

جو ذريعو: www.habr.com

تبصرو شامل ڪريو