Manoratra rindrambaiko miaraka amin'ny fampiasa Windows client-server utility, part 01

Fiarahabana.

Androany aho dia te-hijery ny fizotran'ny fanoratana ny fangatahana mpanjifa-server izay manatanteraka ny asan'ny fitaovana Windows mahazatra, toy ny Telnet, TFTP, et cetera, et cetera amin'ny Java madio. Mazava fa tsy hitondra zava-baovao aho - ireo fitaovana rehetra ireo dia niasa tamim-pahombiazana nandritra ny herintaona mahery, saingy mino aho fa tsy ny rehetra no mahafantatra ny zava-mitranga eo ambanin'ny satroka.

Izany indrindra no horesahina eo ambany fanapahana.

Amin'ity lahatsoratra ity, mba tsy hisintonana azy, ankoatra ny fampahalalana ankapobeny, dia hanoratra momba ny mpizara Telnet ihany aho, fa amin'izao fotoana izao dia misy ihany koa ny fitaovana amin'ny fitaovana hafa - ho any amin'ny ampahany hafa amin'ny andiany.

Voalohany indrindra, mila fantarinao ny atao hoe Telnet, inona no ilaina ary inona no ampiasaina. Tsy hanonona loharano tsy ara-bakiteny aho (raha ilaina, hametaka rohy mankany amin'ny fitaovana momba ny lohahevitra amin'ny faran'ny lahatsoratra aho), hilaza fotsiny aho fa Telnet dia manome fidirana lavitra amin'ny baikon'ny fitaovana. Amin'ny ankapobeny, eto no fiafaran'ny asany (ninia nangina aho momba ny fidirana amin'ny seranan-tsambo; bebe kokoa amin'izany any aoriana). Midika izany fa mba hampiharana azy dia mila manaiky tsipika amin'ny mpanjifa isika, ampita izany amin'ny mpizara, andramo ampita izany amin'ny baiko baiko, vakio ny valin'ny baiko, raha misy, avereno amin'ny mpanjifa ary asehoy eo amin'ny efijery, na, raha misy hadisoana, ampahafantaro ny mpampiasa fa misy zavatra tsy mety.

Mba hampiharana ireo voalaza etsy ambony ireo, dia mila kilasy 2 miasa sy kilasy fitsapana sasany izay hanombohantsika ny mpizara ary hampiasana ny mpanjifa.
Araka izany, amin'izao fotoana izao ny rafitra fampiharana dia ahitana:

  • TelnetClient
  • TelnetClientTester
  • TelnetServer
  • TelnetServerTester

Andeha hojerentsika ny tsirairay amin'izy ireo:

TelnetClient

Ny zavatra rehetra tokony ho vitan'ity kilasy ity dia ny mandefa baiko voaray ary mampiseho ny valiny voaray. Ankoatra izany, mila mifandray amin'ny seranan-tsambo tsy misy dikany (araka ny voalaza etsy ambony) amin'ny fitaovana lavitra ianao ary manapaka azy.

Mba hanatanterahana izany, dia nampiharina ireto asa manaraka ireto:

Fampiasa iray izay maka adiresin'ny socket ho toy ny tohan-kevitra, manokatra fifandraisana ary manomboka ny fampidiran-dresaka sy ny fivoahana (voambara etsy ambony ny fari-piainan'ny stream, ny loharano feno dia eo amin'ny faran'ny lahatsoratra).

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

Mihoatra ny asa mitovy, mampifandray amin'ny seranan-tsambo mahazatra - ho an'ny telnet dia 23 izany


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

Mamaky tarehintsoratra avy amin'ny fitendry ilay asa ary mandefa azy ireo any amin'ny socket mivoaka - izay mahazatra, amin'ny fomba andalana, fa tsy fomba amam-panao:


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

Ny fiasa dia mandray angona avy amin'ny socket ary mampiseho izany eo amin'ny efijery


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

Ny fiasa dia manakana ny fandraisana sy ny fandefasana data


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

TelnetServer

Ity kilasy ity dia tsy maintsy manana fampiasa amin'ny fandraisana baiko avy amin'ny socket, fandefasana azy ho faty, ary fandefasana valiny avy amin'ny baiko hiverina amin'ny socket. Ny programa dia tsy manara-maso ny angon-drakitra fidirana, satria voalohany, na dia ao amin'ny "telnet boxed" aza dia azo atao ny mamolavola ny disk server, ary faharoa, ny olana momba ny fiarovana amin'ity lahatsoratra ity dia esorina amin'ny fitsipika, ary izany no tsy misy. teny momba ny encryption na SSL.

Tsy misy afa-tsy 2 ny fiasa (ny iray amin'izy ireo dia be loatra), ary amin'ny ankapobeny dia tsy fanao tsara izany, fa ho an'ny tanjon'ity asa ity dia toa mety amiko ny mamela ny zava-drehetra amin'ny maha-izy azy.

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

    }

Ny programa dia manokatra ny seranan-tsambon'ny mpizara, mamaky ny angona avy aminy mandra-pahatongany amin'ny toetran'ny fiafaran'ny baiko, mampita ny baiko amin'ny dingana vaovao, ary mamindra ny vokatra avy amin'ny dingana mankany amin'ny socket. Tsotra toy ny basy Kalachnikov ny zava-drehetra.

Arak'izany dia misy enta-mavesatra ho an'ity fiasa ity miaraka amin'ny seranan-tsambo default:

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

Eny ary, araka izany, ny fiasa izay manakana ny mpizara dia tsy misy dikany ihany koa, manapaka ny loop mandrakizay, manitsakitsaka ny toe-javatra misy azy.

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

Tsy hanome kilasy fitsapana eto aho, eto ambany izy ireo - ny hany ataony dia ny mijery ny fiasan'ny fombam-bahoaka. Ao amin'ny git ny zava-drehetra.

Raha fintinina, ao anatin'ny takariva roa dia azonao atao ny mahatakatra ny fitsipiky ny fiasan'ny fitaovana fampiononana lehibe. Ankehitriny, rehefa telenet amin'ny solosaina lavitra isika dia takatsika ny zava-mitranga - nanjavona ny majika)

Noho izany, ny rohy:
Ny loharano rehetra dia teo, misy ary ho avy eto
Momba ny Telnet
Bebe kokoa momba ny Telnet

Source: www.habr.com

Add a comment