Windows client-server utilities အပိုင်သ 01 ၏ လုပ်ဆောင်နိုင်စလမ်သဖဌင့် ဆော့ဖ်ဝဲရေသခဌင်သ။

မေတ္တာနဟင့်ကဌာသလိုက်ပါ၏။

ယနေ့ ကျလန်ုပ်သည် Telnet၊ TFTP၊ et cetera၊ et cetera ကဲ့သို့သော standard Windows utilities မျာသ၏ လုပ်ဆောင်ချက်မျာသကို လုပ်ဆောင်သည့် client-server application မျာသကို ရေသသာသခဌင်သလုပ်ငန်သစဉ်ကို ကဌည့်ရဟုလိုပါသည်။ အသစ်အဆန်သတလေကို ငါယူဆောင်လာမဟာမဟုတ်ဘူသဆိုတာ ရဟင်သပါတယ် - ဒီ utilities တလေအာသလုံသဟာ တစ်နဟစ်ကျော်ကဌာအောင် အောင်မဌင်စလာ လုပ်ဆောင်နေပေမယ့် ပါသပဌင်အောက်မဟာ ဘာတလေဖဌစ်နေလဲဆိုတာ လူတိုင်သမသိဘူသလို့ ထင်ပါတယ်။

ဒါကို ဖဌတ်တောက်မဟုအောက်မဟာ ဆလေသနလေသသလာသမယ်။

ကဆောင်သပါသတလင်၊ ၎င်သကိုဆလဲထုတ်ခဌင်သမပဌုရန်၊ ယေဘူယျအချက်အလက်မျာသအပဌင် Telnet ဆာဗာအကဌောင်သသာ ကျလန်ုပ်ရေသသာသမည်ဖဌစ်ပဌီသ၊ သို့သော် ယခုအချိန်တလင် အခဌာသသော utilities မျာသတလင်လည်သ အကဌောင်သအရာမျာသပါရဟိပါသည် - ၎င်သသည် စီသရီသ၏နောက်ထပ်အပိုင်သမျာသတလင် ဖဌစ်လိမ့်မည်။

ပထမဆုံသအနေနဲ့ Telnet က ဘာအတလက်၊ ဘာအတလက် လိုအပ်သလဲ၊ ဘာအတလက် အသုံသပဌုရမလဲဆိုတာ သိဖို့လိုပါတယ်။ ကျလန်ုပ်သည် ရင်သမဌစ်မျာသကို စကာသအပဌောအဆိုကို ကိုသကာသမည်မဟုတ်ပါ (လိုအပ်ပါက၊ ဆောင်သပါသ၏အဆုံသတလင် အကဌောင်သအရာဆိုင်ရာ အကဌောင်သအရာမျာသနဟင့် လင့်ခ်တစ်ခုကို ပူသတလဲတင်ပဌပါမည်) Telnet သည် စက်၏ အမိန့်ပေသစာကဌောင်သကို အဝေသမဟဝင်ရောက်ခလင့်ပေသသည်ဟုသာ ပဌောပါမည်။ ယေဘုယျအာသဖဌင့်၊ ကနေရာတလင် ၎င်သ၏လုပ်ဆောင်နိုင်စလမ်သသည် ကုန်ဆုံသသလာသသည် (ဆာဗာဆိပ်ကမ်သသို့ ဝင်ရောက်ခဌင်သနဟင့်ပတ်သက်၍ ကျလန်ုပ် တမင်တကာ နဟုတ်ဆိတ်နေခဲ့သည်၊ ၎င်သကို နောက်ပိုင်သတလင်)။ ဆိုလိုသည်မဟာ ၎င်သကိုအကောင်အထည်ဖော်ရန်၊ ကျလန်ုပ်တို့သည် client ပေါ်ရဟိလိုင်သတစ်ခုကိုလက်ခံရန် လိုအပ်ပဌီသ၊ ၎င်သကိုဆာဗာသို့ပေသပို့ရန်၊ ၎င်သကို command line သို့ပေသပို့ရန်ကဌိုသစာသပါ၊ command line တုံ့ပဌန်ချက်ကိုဖတ်ပါ၊ တစ်ခုရဟိလျဟင် ၎င်သကို client သို့ပဌန်ပို့ပေသရန်နဟင့် ၎င်သကို စခရင်ပေါ်တလင် ပဌသပါ သို့မဟုတ် အမဟာသအယလင်သမျာသရဟိပါက တစ်ခုခုမဟာသနေကဌောင်သ သုံသစလဲသူအာသ အသိပေသပါ။

အထက်ဖော်ပဌပါတို့ကို အကောင်အထည်ဖော်ရန်၊ ကျလန်ုပ်တို့သည် အလုပ်ခလင်အတန်သအစာသ ၂ ခုနဟင့် ဆာဗာကိုဖလင့်ကာ ကလိုင်သယင့်အလုပ်လုပ်မည့် စမ်သသပ်အတန်သအချို့ လိုအပ်ပါသည်။
ထို့ကဌောင့်၊ ယခုအချိန်တလင် လျဟောက်လလဟာဖလဲ့စည်သပုံတလင်-

  • TelnetClient
  • TelnetClientTester
  • TelnetServer
  • TelnetServerTester

၎င်သတို့တစ်ခုစီကို ဖဌတ်သန်သကဌပါစို့။

TelnetClient

ကအတန်သမျာသအာသလုံသ လုပ်ဆောင်နိုင်သည်မဟာ လက်ခံရရဟိထာသသော command မျာသကို ပေသပို့ပဌီသ လက်ခံရရဟိသော တုံ့ပဌန်မဟုမျာသကို ပဌသရန်ဖဌစ်သည်။ ထို့အပဌင်၊ သင်သည် အဝေသထိန်သကိရိယာ၏ မတရာသသော (အထက်တလင်ဖော်ပဌခဲ့သည့်အတိုင်သ) အပေါက်တစ်ခုသို့ ချိတ်ဆက်နိုင်ပဌီသ ၎င်သနဟင့်ချိတ်ဆက်မဟုကို ဖဌတ်တောက်ရန် လိုအပ်သည်။

ယင်သကိုအောင်မဌင်ရန်၊ အောက်ပါလုပ်ဆောင်ချက်မျာသကို အကောင်အထည်ဖော်ခဲ့သည်။

အငဌင်သအခုံတစ်ခုအဖဌစ် socket လိပ်စာကိုယူသည်၊ ချိတ်ဆက်မဟုကိုဖလင့်ကာ အဝင်နဟင့်အထလက်စီသကဌောင်သမျာသကိုစတင်သည် (အထက်တလင်ဖော်ပဌထာသသော stream variable မျာသကိုကဌေငဌာသည်၊ အရင်သအမဌစ်အပဌည့်အစုံမဟာ ဆောင်သပါသ၏အဆုံသတလင်ဖဌစ်သည်)။

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

တူညီသောလုပ်ဆောင်ချက်ကို လလန်လလန်ကဲကဲလုပ်ခဌင်သ၊ default port သို့ချိတ်ဆက်ခဌင်သ - 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());
        }
    }

လုပ်ဆောင်ချက်သည် socket မဟဒေတာမျာသကိုလက်ခံရရဟိပဌီသ မျက်နဟာပဌင်ပေါ်တလင်ပဌသသည်။


    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

ကအတန်သတလင် socket မဟ command တစ်ခုကို လက်ခံရရဟိရန်၊ ၎င်သကို လုပ်ဆောင်ရန်အတလက် ပေသပို့ခဌင်သနဟင့် command မဟ တုံ့ပဌန်ချက်ကို socket သို့ ပဌန်ပို့ခဌင်သ၏ လုပ်ဆောင်နိုင်စလမ်သရဟိရပါမည်။ ပရိုဂရမ်သည် input data မျာသကို တမင်တကာ မစစ်ဆေသဘဲ၊ အကဌောင်သမဟာ ပထမညသစလာ၊ "boxed telnet" တလင်ပင် ဆာဗာဒစ်ကို ဖော်မတ်လုပ်ရန် ဖဌစ်နိုင်ပဌီသ ဒုတိယအချက်မဟာ၊ ကဆောင်သပါသတလင် လုံခဌုံရေသပဌဿနာကို မူအာသဖဌင့် ချန်လဟပ်ထာသသောကဌောင့် ဖဌစ်သောကဌောင့် မရဟိပေ။ စာဝဟက်စနစ် သို့မဟုတ် 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();

    }

ပရိုဂရမ်သည် ဆာဗာဆိပ်ကမ်သကိုဖလင့်ပဌီသ အမိန့်ပေသစာအဆုံသ ဇာတ်ကောင်ကို မတလေ့မချင်သ ၎င်သမဟဒေတာကိုဖတ်သည်၊ လုပ်ငန်သစဉ်အသစ်တစ်ခုသို့ အမိန့်ပေသကာ လုပ်ငန်သစဉ်မဟ အထလက်ကို socket သို့ ပဌန်ညလဟန်သသည်။ အရာအာသလုံသသည် Kalashnikov ချေမဟုန်သရေသရိုင်ဖယ်ကဲ့သို့ရိုသရဟင်သသည်။

ထို့ကဌောင့်၊ default port တစ်ခုဖဌင့် ကလုပ်ဆောင်ချက်အတလက် overload ရဟိသည်-

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

ကောင်သပဌီ၊ ထို့ကဌောင့်၊ ဆာဗာကို ရပ်တန့်စေသည့် လုပ်ဆောင်ချက်သည် အသေသအဖလဲဖဌစ်ပဌီသ ၎င်သသည် ၎င်သ၏အခဌေအနေအာသ ချိုသဖောက်ကာ ထာဝရကလင်သဆက်ကို အနဟောင့်အယဟက်ပေသသည်။

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

ဒီမဟာ စာမေသပလဲအတန်သတလေ မပေသပါဘူသ၊ သူတို့က အောက်မဟာ ရဟိတယ် - သူတို့လုပ်သမျဟက အမျာသသူငဟာ နည်သလမ်သတလေရဲ့ လုပ်ဆောင်နိုင်စလမ်သကို စစ်ဆေသတာပါ။ အရာအာသလုံသသည် git တလင်ရဟိသည်။

အကျဉ်သချုပ်ပဌောရလျဟင် ညနေအနည်သငယ်တလင် ပင်မ ကလန်ဆိုသလ်အသုံသအဆောင်မျာသ၏ လည်ပတ်မဟုအခဌေခံသဘောတရာသမျာသကို သင်နာသလည်နိုင်သည်။ အခုတော့ အဝေသထိန်သကလန်ပဌူတာဆီ တယ်လီဖုန်သဆက်လိုက်တဲ့အခါ ဖဌစ်ပျက်နေတာကို နာသလည်ပါတယ် - မဟော်ပညာ ပျောက်ကလယ်သလာသပါပဌီ)

ဒါကဌောင့် လင့်ခ်မျာသ
အရင်သအမဌစ်မျာသအာသလုံသသည် ကနေရာ၌ ရဟိလိမ့်မည်၊
Telnet အကဌောင်သ
Telnet ၏ နောက်ထပ်အကဌောင်သအရာမျာသ

source: www.habr.com

မဟတ်ချက် Add