ونڈوز کلائنٹ سرور یوٹیلیٹیز کی فعالیت کے ساتھ سافٹ ویئر لکھنا، حصہ 01

Приветствую.

آج میں کلائنٹ-سرور ایپلی کیشنز کو لکھنے کے عمل کو دیکھنا چاہوں گا جو معیاری ونڈوز یوٹیلیٹیز جیسے کہ ٹیل نیٹ، ٹی ایف ٹی پی، ایٹ سیٹرا، وغیرہ خالص جاوا میں کام انجام دیتے ہیں۔ یہ واضح ہے کہ میں کچھ نیا نہیں لاؤں گا - یہ تمام افادیتیں ایک سال سے زیادہ عرصے سے کامیابی کے ساتھ کام کر رہی ہیں، لیکن مجھے یقین ہے کہ ہر کوئی نہیں جانتا کہ ہڈ کے نیچے کیا ہو رہا ہے۔

یہ بالکل وہی ہے جو کٹ کے تحت بحث کی جائے گی.

اس مضمون میں، عام معلومات کے علاوہ، اسے باہر نہ گھسیٹنے کے لیے، میں صرف ٹیل نیٹ سرور کے بارے میں لکھوں گا، لیکن اس وقت دیگر افادیت پر بھی مواد موجود ہے - یہ سیریز کے مزید حصوں میں ہوگا۔

سب سے پہلے، آپ کو یہ معلوم کرنے کی ضرورت ہے کہ ٹیل نیٹ کیا ہے، اس کی کیا ضرورت ہے، اور اسے کس چیز کے لیے استعمال کیا جاتا ہے۔ میں لفظی طور پر ذرائع کا حوالہ نہیں دوں گا (اگر ضروری ہو تو، میں مضمون کے آخر میں موضوع پر مواد کا لنک منسلک کروں گا)، میں صرف یہ کہوں گا کہ ٹیل نیٹ ڈیوائس کی کمانڈ لائن تک ریموٹ رسائی فراہم کرتا ہے۔ مجموعی طور پر، یہ وہ جگہ ہے جہاں اس کی فعالیت ختم ہوتی ہے (میں نے جان بوجھ کر سرور پورٹ تک رسائی کے بارے میں خاموشی اختیار کی؛ اس پر مزید بعد میں)۔ اس کا مطلب یہ ہے کہ اسے نافذ کرنے کے لیے، ہمیں کلائنٹ پر ایک لائن کو قبول کرنا ہوگا، اسے سرور پر منتقل کرنا ہوگا، اسے کمانڈ لائن پر منتقل کرنے کی کوشش کرنی ہوگی، کمانڈ لائن کا جواب پڑھنا ہوگا، اگر کوئی ہے تو اسے کلائنٹ کو واپس بھیجنا ہوگا اور اسے اسکرین پر ڈسپلے کریں، یا، اگر غلطیاں ہوں، تو صارف کو بتائیں کہ کچھ غلط ہے۔

مذکورہ بالا کو نافذ کرنے کے لیے، اس کے مطابق، ہمیں 2 ورکنگ کلاسز اور کچھ ٹیسٹ کلاس کی ضرورت ہے جہاں سے ہم سرور لانچ کریں گے اور جس کے ذریعے کلائنٹ کام کرے گا۔
اس کے مطابق، اس وقت درخواست کی ساخت میں شامل ہیں:

  • ٹیل نیٹ کلائنٹ
  • ٹیل نیٹ کلائنٹ ٹیسٹر
  • ٹیل نیٹ سرور
  • ٹیل نیٹ سرور ٹیسٹر

آئیے ان میں سے ہر ایک کے ذریعے چلتے ہیں:

ٹیل نیٹ کلائنٹ

اس کلاس کو یہ کرنے کے قابل ہونا چاہئے کہ موصولہ کمانڈ بھیجے اور موصولہ جوابات دکھائے۔ اس کے علاوہ، آپ کو ریموٹ ڈیوائس کے صوابدیدی (جیسا کہ اوپر بتایا گیا ہے) بندرگاہ سے رابطہ قائم کرنے اور اس سے منقطع ہونے کی ضرورت ہے۔

اس کو حاصل کرنے کے لیے، مندرجہ ذیل افعال کو لاگو کیا گیا تھا:

ایک فنکشن جو ایک ساکٹ ایڈریس کو بطور دلیل لیتا ہے، کنکشن کھولتا ہے اور ان پٹ اور آؤٹ پٹ اسٹریمز شروع کرتا ہے (اسٹریم متغیرات اوپر بیان کیے گئے ہیں، مکمل ذرائع مضمون کے آخر میں ہیں)۔

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

ایک ہی فنکشن کو اوور لوڈ کرنا، ڈیفالٹ پورٹ سے جڑنا - ٹیل نیٹ کے لیے یہ 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();
    }
}

ٹیل نیٹ سرور

اس کلاس میں ساکٹ سے کمانڈ وصول کرنے، اسے عمل میں لانے کے لیے بھیجنے، اور کمانڈ سے جواب ساکٹ کو واپس بھیجنے کی فعالیت ہونی چاہیے۔ پروگرام جان بوجھ کر ان پٹ ڈیٹا کو چیک نہیں کرتا ہے، کیونکہ سب سے پہلے، "باکسڈ ٹیل نیٹ" میں بھی سرور ڈسک کو فارمیٹ کرنا ممکن ہے، اور دوسری بات، اس مضمون میں سیکیورٹی کے مسئلے کو اصولی طور پر چھوڑ دیا گیا ہے، اور اسی لیے وہاں موجود نہیں ہے۔ خفیہ کاری یا 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;
    }

میں یہاں ٹیسٹ کلاسز نہیں دوں گا، وہ نیچے ہیں - وہ صرف عوامی طریقوں کی فعالیت کو چیک کرتے ہیں۔ سب کچھ گٹ پر ہے۔

خلاصہ کرنے کے لئے، ایک دو شام میں آپ مرکزی کنسول کی افادیت کے آپریشن کے اصولوں کو سمجھ سکتے ہیں۔ اب، جب ہم ریموٹ کمپیوٹر پر ٹیلی نیٹ کرتے ہیں، تو ہم سمجھتے ہیں کہ کیا ہو رہا ہے - جادو غائب ہو گیا ہے)

تو، لنکس:
تمام ذرائع یہاں تھے، ہیں اور رہیں گے۔
ٹیل نیٹ کے بارے میں
ٹیل نیٹ کے بارے میں مزید

ماخذ: www.habr.com

نیا تبصرہ شامل کریں