Навиштани нармафзор бо функсияҳои утилитаҳои муштарӣ-сервери Windows, қисми 01

Салом.

Имрӯз ман мехоҳам ба раванди навиштани замимаҳои муштарӣ-сервер, ки вазифаҳои утилитаҳои стандартии Windows-ро иҷро мекунанд, аз қабили Telnet, TFTP, ва ғайра ва ғайраро дар Java тоза дида бароем. Равшан аст, ки ман ҳеҷ чизи нав намеоварам - ҳамаи ин хидматрасониҳо зиёда аз як сол бомуваффақият кор мекунанд, аммо ман боварӣ дорам, ки на ҳама медонанд, ки дар зери сарпӯш чӣ мегузарад.

Ин маҳз ҳамон чизест, ки дар зери буриш баррасӣ мешавад.

Дар ин мақола, барои он ки онро кашола накунед, ба ғайр аз маълумоти умумӣ, ман танҳо дар бораи сервери Telnet менависам, аммо дар айни замон мавод дар бораи дигар утилитаҳо мавҷуд аст - он дар қисматҳои минбаъдаи силсила хоҳад буд.

Пеш аз ҳама, шумо бояд муайян кунед, ки Telnet чист, он барои чӣ лозим аст ва барои чӣ истифода мешавад. Ман айнан аз манбаъҳо иқтибос намекунам (агар лозим бошад, ман истинод ба маводҳои мавзӯъро дар охири мақола замима мекунам), ман танҳо мегӯям, ки Telnet дастрасии дурдаст ба сатри фармони дастгоҳро таъмин мекунад. Умуман, ин ҷо функсияи он ба охир мерасад (ман дидаву дониста дар бораи дастрасӣ ба порти сервер хомӯш мондам; бештар дар ин бора баъдтар). Ин маънои онро дорад, ки барои татбиқи он, мо бояд сатри мизоҷро қабул кунем, онро ба сервер гузаронем, кӯшиш кунем, ки онро ба сатри фармон гузаронем, ҷавоби сатри фармонро хонем, агар мавҷуд бошад, онро ба муштарӣ баргардонем ва онро дар экран нишон диҳед, ё агар хатогӣ бошад, ба корбар хабар диҳед, ки чизе нодуруст аст.

Барои татбиқи гуфтаҳои боло, мутаносибан ба мо 2 синфи корӣ ва баъзе синфи санҷишӣ лозим аст, ки аз он мо серверро оғоз мекунем ва тавассути он муштарӣ кор хоҳад кард.
Мувофиқи он, дар айни замон сохтори ариза дар бар мегирад:

  • TelnetClient
  • TelnetClientTester
  • TelnetServer
  • TelnetServerTester

Биёед ҳар яки онҳоро дида бароем:

TelnetClient

Ҳамаи ин синф бояд ин фиристодани фармонҳои гирифташуда ва нишон додани ҷавобҳои гирифташуда бошад. Илова бар ин, ба шумо лозим аст, ки ба бандари худсарона (чунон ки дар боло зикр шуд) -и дастгоҳи дурдаст пайваст шуда, аз он ҷудо шавед.

Барои ноил шудан ба ин вазифаҳои зерин амалӣ карда шуданд:

Функсияе, ки суроғаи розеткаро ҳамчун аргумент мегирад, пайвастро мекушояд ва ҷараёнҳои вуруд ва баромадро оғоз мекунад (тағйирёбандаҳои ҷараён дар боло эълон шудаанд, манбаъҳои пурра дар охири мақола мебошанд).

 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

Манбаъ: will.com

Илова Эзоҳ