Nermalava nivîsandinê bi fonksiyona karûbarên xerîdar-servera Windows-ê, beş 01

Silav.

Îro ez dixwazim li pêvajoya nivîsandina serîlêdanên xerîdar-server ku fonksiyonên karûbarên standard ên Windows-ê, wek Telnet, TFTP, û hwd, û hwd di Java-ya paqij de pêk tînin, binihêrim. Eşkere ye ku ez ê tiştek nû nekim - van hemî karûbar ji salekê zêdetir e ku bi serfirazî dixebitin, lê ez bawer dikim ku her kes nizane ka çi di bin kaxezê de diqewime.

Ya ku dê di bin qutkirinê de were nîqaş kirin tam ev e.

Di vê gotarê de, ji bo ku wê nekişîne, ji bilî agahdariya gelemperî, ez ê tenê li ser servera Telnet binivîsim, lê di vê gavê de li ser karûbarên din jî materyal heye - ew ê di beşên din ên rêzê de be.

Berî her tiştî, hûn hewce ne ku fêr bibin ka Telnet çi ye, ji bo çi hewce ye û ji bo çi tê bikar anîn. Ez ê çavkaniyan bi lêv nebêjim (heke hewce bike, ez ê di dawiya gotarê de girêdanek bi materyalên li ser mijarê ve girêbidim), ez ê tenê bibêjim ku Telnet ji dûr ve gihandina rêza fermanê ya cîhazê peyda dike. Bi gelemperî, li vir fonksiyona wê bi dawî dibe (min bi qestî li ser gihîştina porta serverê bêdeng mam; li ser wê paşê bêtir). Ev tê vê wateyê ku ji bo bicîhkirina wê, pêdivî ye ku em rêzek li ser xerîdar qebûl bikin, wê ji serverê re derbas bikin, hewl bidin ku wê derbasî rêzika fermanê bikin, bersiva rêza fermanê bixwînin, heke yek hebe, wê dîsa ji xerîdar re derbas bikin û wê li ser ekranê nîşan bidin, an jî heke xeletiyek hebe, bila bikarhêner bizanibe ku tiştek xelet e.

Ji bo bicîhkirina ya jorîn, li gorî vê yekê, em hewceyê 2 çînên xebatê û hin pola ceribandinê ne ku em ê serverê jê re bidin destpêkirin û bi navgîniya ku xerîdar dê bixebite.
Li gorî vê yekê, di vê gavê de strukturên serîlêdanê hene:

  • TelnetClient
  • TelnetClientTester
  • TelnetServer
  • TelnetServerTester

Ka em her yek ji wan derbas bikin:

TelnetClient

Tiştê ku divê ev pola karibe bike ev e ku emrên wergirtî bişîne û bersivên wergirtî nîşan bide. Wekî din, hûn hewce ne ku hûn bi benderek keyfî (wek ku li jor hatî destnîşan kirin) amûrek dûr ve girêdin û jê qut bibin.

Ji bo bidestxistina vê yekê, fonksiyonên jêrîn hatine bicîh kirin:

Fonksiyonek ku navnîşanek soketê wekî arguman digire, têkiliyek vedike û herikên ketin û derketinê dest pê dike (guhêrbarên çemê li jor hatine ragihandin, çavkaniyên tevahî li dawiya gotarê ne).

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

Zêdekirina heman fonksiyonê, girêdana bi porta xwerû - ji bo telnet ev 23 ye


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

Fonksiyon tîpan ji klavyeyê dixwîne û wan dişîne soketa derketinê - ku tîpîk e, di moda rêzê de, ne moda 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());
        }
    }

Fonksiyon daneyan ji soketê distîne û li ser ekranê nîşan dide


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

Fonksiyon wergirtin û şandina daneyan rawestîne


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

TelnetServer

Divê ev çîn fonksiyona wergirtina fermanek ji soketê, şandina wê ji bo darvekirinê û şandina bersivek ji fermanê ji soketê re hebe. Bername bi qestî daneyên têketinê kontrol nake, ji ber ku yekem, tewra di "telneta qutkirî" de jî gengaz e ku dîska serverê format bike, û ya duyemîn jî, mijara ewlehiyê di vê gotarê de di prensîbê de ji holê hatiye rakirin, û ji ber vê yekê tune ye. peyvek li ser şîfrekirin an SSL.

Tenê 2 fonksiyon hene (yek ji wan zêde ye), û bi gelemperî ev ne pratîkek pir baş e, lê ji bo mebestên vê peywirê, ji min re minasib xuya bû ku ez her tiştî wekî xwe bihêlim.

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

    }

Bername porta serverê vedike, daneyan jê dixwîne heya ku bi karakterek dawiya fermanê re rû bi rû bimîne, fermanê di pêvajoyek nû re derbas dike, û encam ji pêvajoyê ber bi soketê ve beralî dike. Her tişt bi qasî çeka kalaşnîkovê hêsan e.

Li gorî vê yekê, ji bo vê fonksiyonê bi portek xwerû re bargiraniyek heye:

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

Welê, li gorî vê yekê, fonksiyona ku serverê rawestîne jî piçûk e, ew lûleya herheyî qut dike, rewşa wê binpê dike.

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

Ez ê li vir dersên ceribandinê nekim, ew li jêr in - ya ku ew dikin ev e ku fonksiyona rêbazên gelemperî kontrol bikin. Her tişt li ser piyan e.

Bi kurtasî, di çend êvaran de hûn dikarin prensîbên xebitandinê yên karûbarên sereke yên konsolê fam bikin. Naha, gava ku em bi komputerek dûr ve têlefon dikin, em fam dikin ka çi diqewime - sêrbaz winda bûye)

Ji ber vê yekê, girêdan:
Hemû çavkanî li vir bûn, hene û dê hebin
Der barê Telnet
Zêdetir li ser Telnet

Source: www.habr.com

Add a comment