Parangkat lunak nyerat sareng fungsionalitas utilitas klien-server Windows, bagian 01

salam.

Dinten ieu kuring hoyong ningali prosés nulis aplikasi klien-server anu ngalaksanakeun fungsi utilitas Windows standar, sapertos Telnet, TFTP, sareng sajabana, sareng sajabana dina Java murni. Ieu jelas yén kuring moal mawa nanaon anyar - sagala utiliti ieu geus suksés digawé pikeun leuwih ti sataun, tapi kuring yakin teu sadaya jelema weruh naon anu lumangsung dina tiung.

Ieu persis naon anu bakal dibahas dina cut.

Dina artikel ieu, dina urutan teu nyered kaluar, sajaba informasi umum, abdi ngan bakal nulis ngeunaan server Telnet, tapi di momen aya ogé bahan dina Utiliti séjén - eta bakal di bagian salajengna ti séri.

Mimiti, anjeun kedah terang naon Telnet, naon anu diperyogikeun, sareng naon anu dianggo. Kuring moal cutatan sumber verbatim (lamun perlu, kuring bakal ngagantelkeun tumbu ka bahan dina topik di ahir artikel), Kuring ngan bakal disebutkeun yen Telnet nyadiakeun aksés jauh ka garis paréntah alat. Sacara umum, ieu téh tempat fungsionalitas na ends (Kuring ngahaja diteundeun jempé ngeunaan ngakses port server; langkung lengkep ihwal nu engké). Ieu ngandung harti yén pikeun nerapkeun éta, urang kedah nampi garis dina klien, paskeun ka server, cobian kirimkeun ka garis paréntah, baca réspon garis paréntah, upami aya, paskeun deui ka klien sareng mintonkeun eta dina layar, atawa, lamun kasalahan, hayu pamaké nyaho yén aya nu salah.

Pikeun ngalaksanakeun di luhur, sasuai, urang peryogi 2 kelas kerja sareng sababaraha kelas uji dimana urang bakal ngaluncurkeun server sareng dimana klien bakal jalan.
Sasuai, ayeuna struktur aplikasi ngawengku:

  • TelnetClient
  • TelnetClientTester
  • TelnetServer
  • TelnetServerTester

Hayu urang ngaliwat unggal sahijina:

TelnetClient

Sadaya kelas ieu kedah tiasa dilakukeun nyaéta ngirim paréntah anu ditampi sareng nunjukkeun réspon anu ditampi. Sajaba ti éta, anjeun kudu bisa nyambung ka wenang (sakumaha disebutkeun di luhur) port sahiji alat jauh jeung megatkeun sambungan ti dinya.

Pikeun ngahontal ieu, fungsi di handap ieu dilaksanakeun:

Fungsi anu nyandak alamat stop kontak salaku argumen, muka sambungan sareng ngamimitian aliran input sareng kaluaran (variabel aliran dinyatakeun di luhur, sumber pinuh aya dina tungtung tulisan).

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

Overloading fungsi anu sarua, nyambungkeun ka port standar - pikeun telnet ieu 23


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

Fungsina maca karakter tina keyboard sareng ngirimkeunana ka stop kontak kaluaran - anu khas, dina modeu garis, sanés modeu karakter:


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

Fungsina nampi data tina stop kontak sareng nampilkeunana dina layar


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

Fungsina ngeureunkeun panarimaan sareng pangiriman data


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

TelnetServer

kelas ieu kudu boga pungsi narima paréntah ti stop kontak a, ngirim eta pikeun palaksanaan, jeung ngirim respon ti paréntah deui stop kontak nu. Program ngahaja henteu pariksa data input, sabab mimitina, sanajan dina "telnet boxed" tiasa pormat disk server, sareng kadua, masalah kaamanan dina tulisan ieu dileungitkeun prinsipna, sareng éta naha henteu aya. kecap ngeunaan enkripsi atanapi SSL.

Aya ngan 2 fungsi (salah sahijina overloaded), sarta sacara umum ieu teu prakték pohara alus, tapi keur kaperluan ieu tugas, eta seemed luyu jeung kuring ninggalkeun sagalana sakumaha anu kasebut.

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

    }

Programna muka port server, maca data ti dinya dugi ka mendakan karakter tungtung paréntah, ngalirkeun paréntah kana prosés énggal, sareng alihan kaluaran tina prosés kana stop kontak. Sadayana saderhana sapertos bedil serbu Kalashnikov.

Sasuai, aya kaleuleuwihan pikeun fungsi ieu sareng port standar:

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

Nya, sasuai, fungsi anu ngeureunkeun server ogé sepele, éta ngaganggu loop anu langgeng, ngalanggar kaayaanana.

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

Kuring moal masihan kelas tés di dieu, aranjeunna di handap - sadayana anu aranjeunna lakukeun nyaéta pariksa pungsionalitas metode umum. Sagalana aya dina git.

Pikeun nyimpulkeun, dina sababaraha soré anjeun tiasa ngartos prinsip operasi utilitas konsol utama. Ayeuna, nalika urang telenet ka komputer jauh, urang ngartos naon anu lumangsung - magic geus ngiles)

Janten, tautan:
Sadaya sumber éta, aya sareng bakal aya di dieu
Ngeunaan Telnet
Langkung seueur ngeunaan Telnet

sumber: www.habr.com

Tambahkeun komentar