Sọfitiwia kikọ pẹlu iṣẹ ṣiṣe ti awọn ohun elo olupin alabara Windows, apakan 01

Ẹ kí.

Loni Emi yoo fẹ lati wo ilana kikọ awọn ohun elo olupin-olupin ti o ṣe awọn iṣẹ ti awọn ohun elo Windows boṣewa, gẹgẹbi Telnet, TFTP, et cetera, ati cetera ni Java mimọ. O han gbangba pe Emi kii yoo mu ohunkohun tuntun wa - gbogbo awọn ohun elo wọnyi ti n ṣiṣẹ ni aṣeyọri fun diẹ sii ju ọdun kan lọ, ṣugbọn Mo gbagbọ pe kii ṣe gbogbo eniyan mọ ohun ti n ṣẹlẹ labẹ hood.

Eleyi jẹ gangan ohun ti yoo wa ni sísọ labẹ awọn ge.

Ninu nkan yii, lati ma fa jade, ni afikun si alaye gbogbogbo, Emi yoo kọ nipa olupin Telnet nikan, ṣugbọn ni akoko yii awọn ohun elo tun wa lori awọn ohun elo miiran - yoo wa ni awọn apakan siwaju ti jara naa.

Ni akọkọ, o nilo lati ṣawari kini Telnet jẹ, kini o nilo fun, ati kini o lo fun. Emi kii yoo sọ awọn orisun verbatim (ti o ba jẹ dandan, Emi yoo so ọna asopọ kan si awọn ohun elo lori koko-ọrọ ni ipari nkan naa), Emi yoo sọ nikan pe Telnet pese iwọle si latọna jijin si laini aṣẹ ti ẹrọ naa. Ni gbogbogbo, eyi ni ibi ti iṣẹ ṣiṣe rẹ pari (Mo mọọmọ pa ipalọlọ nipa iwọle si ibudo olupin; diẹ sii lori iyẹn nigbamii). Eyi tumọ si pe lati ṣe imuse rẹ, a nilo lati gba laini kan lori alabara, firanṣẹ si olupin naa, gbiyanju lati kọja si laini aṣẹ, ka esi laini aṣẹ, ti o ba wa, firanṣẹ pada si alabara ati han loju iboju, tabi, ti o ba jẹ aṣiṣe, jẹ ki olumulo mọ pe nkan kan jẹ aṣiṣe.

Lati ṣe eyi ti o wa loke, ni ibamu, a nilo awọn kilasi iṣẹ 2 ati diẹ ninu awọn kilasi idanwo lati eyiti a yoo ṣe ifilọlẹ olupin ati nipasẹ eyiti alabara yoo ṣiṣẹ.
Nitorinaa, ni akoko yii eto ohun elo pẹlu:

  • TelnetClient
  • TelnetClientTester
  • TelnetServer
  • TelnetServerTester

Jẹ ki a lọ nipasẹ ọkọọkan wọn:

TelnetClient

Gbogbo kilasi yii yẹ ki o ni anfani lati ṣe ni firanṣẹ awọn aṣẹ ti o gba ati ṣafihan awọn idahun ti o gba. Ni afikun, o nilo lati ni anfani lati sopọ si lainidii (gẹgẹbi a ti sọ loke) ibudo ti ẹrọ jijin ki o ge asopọ lati ọdọ rẹ.

Lati ṣe aṣeyọri eyi, awọn iṣẹ wọnyi ni a ṣe:

Iṣẹ kan ti o gba adirẹsi iho bi ariyanjiyan, ṣii asopọ kan ati bẹrẹ titẹ sii ati awọn ṣiṣan ti njade (awọn oniyipada ṣiṣan ti sọ loke, awọn orisun kikun wa ni ipari nkan naa).

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

Ikojọpọ iṣẹ kanna, sisopọ si ibudo aiyipada - fun telnet eyi jẹ 23


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

Iṣẹ naa ka awọn ohun kikọ lati ori bọtini itẹwe o firanṣẹ si iho ti o wu jade - eyiti o jẹ aṣoju, ni ipo laini, kii ṣe ipo ohun kikọ:


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

Iṣẹ naa gba data lati iho ati ṣafihan rẹ loju iboju


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

Iṣẹ naa duro gbigba data ati gbigbe


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

TelnetServer

Kilasi yii gbọdọ ni iṣẹ ṣiṣe ti gbigba aṣẹ lati iho, fifiranṣẹ fun ipaniyan, ati fifiranṣẹ esi lati aṣẹ pada si iho. Eto naa mọọmọ ko ṣayẹwo data titẹ sii, nitori akọkọ, paapaa ni “telnet apoti” o ṣee ṣe lati ṣe ọna kika disiki olupin, ati ni ẹẹkeji, ọrọ aabo ni nkan yii ti yọkuro ni ipilẹ, ati pe idi ti ko si. ọrọ kan nipa fifi ẹnọ kọ nkan tabi SSL.

Awọn iṣẹ 2 nikan wa (ọkan ninu wọn jẹ apọju), ati ni gbogbogbo eyi kii ṣe iṣe ti o dara pupọ, ṣugbọn fun awọn idi ti iṣẹ yii, o dabi ẹni pe o yẹ fun mi lati fi ohun gbogbo silẹ bi o ti jẹ.

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

    }

Eto naa ṣii ibudo olupin, ka data lati ọdọ rẹ titi ti o fi pade ohun kikọ ipari pipaṣẹ kan, kọja aṣẹ naa si ilana tuntun kan, ati ṣe atunṣe abajade lati ilana naa si iho. Ohun gbogbo rọrun bi ibọn ikọlu Kalashnikov.

Nitorinaa, apọju wa fun iṣẹ yii pẹlu ibudo aiyipada:

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

O dara, ni ibamu, iṣẹ ti o da olupin duro tun jẹ ohun kekere, o ṣe idiwọ lupu ayeraye, ti o ṣẹ ipo rẹ.

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

Emi kii yoo fun awọn kilasi idanwo nibi, wọn wa ni isalẹ - gbogbo ohun ti wọn ṣe ni ṣayẹwo iṣẹ ṣiṣe ti awọn ọna gbangba. Ohun gbogbo wa lori git.

Lati ṣe akopọ, ni awọn irọlẹ meji kan o le loye awọn ilana ti iṣiṣẹ ti awọn ohun elo console akọkọ. Bayi, nigba ti a ba telenet si kọnputa latọna jijin, a loye ohun ti n ṣẹlẹ - idan ti parẹ)

Nitorina, awọn ọna asopọ:
Gbogbo awọn orisun wà, ati ki o yoo wa nibi
Nipa Telnet
Diẹ ẹ sii nipa Telnet

orisun: www.habr.com

Fi ọrọìwòye kun