Isofthiwe yokubhala enomsebenzi wezinsiza ze-Windows client-server, ingxenye 01

Sanibonani.

Namuhla ngithanda ukubheka inqubo yokubhala izinhlelo zokusebenza zeseva yeklayenti ezenza imisebenzi yezinsiza ezijwayelekile zeWindows, njengeTelnet, TFTP, et cetera, et cetera kuJava emsulwa. Kuyacaca ukuthi ngeke ngilethe lutho olusha - zonke lezi zinsiza bezisebenza ngempumelelo isikhathi esingaphezu konyaka owodwa, kodwa ngikholwa ukuthi akuwona wonke umuntu owaziyo ukuthi kwenzekani ngaphansi kwe-hood.

Yilokho kanye okuzoxoxwa ngakho ngaphansi kokunqunywa.

Kulesi sihloko, ukuze ngingayidonsi ngaphandle, ngaphezu kolwazi olujwayelekile, ngizobhala kuphela ngeseva ye-Telnet, kodwa okwamanje kukhona okubonakalayo kwezinye izinsiza - kuzoba kwezinye izingxenye zochungechunge.

Okokuqala, udinga ukuthola ukuthi i-Telnet iyini, idingeka ini, nokuthi isetshenziselwa ini. Ngeke ngicaphune imithombo nezwi nezwi (uma kunesidingo, ngizonamathisela isixhumanisi ezintweni esihlokweni ekupheleni kwesihloko), ngizosho kuphela ukuthi i-Telnet inikeza ukufinyelela okukude kumugqa womyalo wedivayisi. Ngokuvamile, kulapho ukusebenza kwayo kuphela khona (ngathula ngamabomu mayelana nokufinyelela imbobo yeseva; okuningi ngalokho kamuva). Lokhu kusho ukuthi ukuze siyisebenzise, ​​sidinga ukwamukela umugqa kuklayenti, siwudlulisele kuseva, sizame ukuwudlulisela kulayini womyalo, sifunde impendulo yomugqa womyalo, uma kukhona, sidlulisele kuklayenti futhi. bonisa esikrinini, noma, uma amaphutha, yazisa umsebenzisi ukuthi kukhona okungalungile.

Ukuze sisebenzise lokhu okungenhla, ngokufanele, sidinga amakilasi okusebenza angu-2 kanye nesigaba esithile sokuhlola esizokwethula kuso iseva nalapho iklayenti lizosebenza khona.
Ngakho-ke, okwamanje isakhiwo sohlelo lokusebenza sihlanganisa:

  • I-TelnetClient
  • I-TelnetClientTester
  • I-TelnetServer
  • I-TelnetServerTester

Ake sidlule ngayinye yazo:

I-TelnetClient

Konke leli klasi okufanele likwazi ukukwenza ukuthumela imiyalo eyamukelwe futhi libonise izimpendulo ezitholiwe. Ngaphezu kwalokho, udinga ukwazi ukuxhuma embobeni engafanele (njengoba kushiwo ngenhla) yedivayisi ekude futhi unqamule kuyo.

Ukufeza lokhu, le misebenzi elandelayo yenziwe:

Umsebenzi othatha ikheli lesokhethi njengempikiswano, uvula uxhumano bese uqala imifudlana yokokufaka nokuphumayo (okuguquguqukayo kokusakaza kumenyezelwa ngenhla, imithombo egcwele isekupheleni kwesihloko).

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

Ukulayisha ngokweqile umsebenzi ofanayo, ukuxhuma embobeni yokuzenzakalelayo - ku-telnet lokhu kungu-23


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

Umsebenzi ufunda izinhlamvu kukhibhodi futhi uzithumele kusokhethi yokukhipha - okuyinto evamile, kumodi yomugqa, hhayi imodi yezinhlamvu:


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

Umsebenzi uthola idatha kusokhethi bese uyibonisa esikrinini


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

Uhlelo lumisa ukwamukela nokudluliswa kwedatha


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

I-TelnetServer

Lesi sigaba kufanele sibe nomsebenzi wokuthola umyalo ovela kusokhethi, uwuthumele ukuze usetshenziswe, futhi uthumela impendulo esuka kumyalo emuva kusokhethi. Uhlelo ngamabomu aluhloli idatha yokufaka, ngoba okokuqala, ngisho naku-"boxed telnet" kungenzeka ukufometha idiski yeseva, futhi okwesibili, indaba yokuphepha kulesi sihloko ishiywe ngokusemthethweni, yingakho kungekho igama mayelana nokubethela noma i-SSL.

Kunemisebenzi emi-2 kuphela (omunye wayo ugcwele ngokweqile), futhi ngokujwayelekile lokhu akuwona umkhuba omuhle kakhulu, kodwa ngezinhloso zalo msebenzi, kwabonakala kufanelekile kimi ukushiya konke njengoba kunjalo.

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

    }

Uhlelo luvula imbobo yeseva, lufunde idatha kuyo kuze kube yilapho luhlangana nohlamvu lokugcina lomyalo, ludlulisela umyalo enqubweni entsha, futhi luqondise kabusha okukhiphayo kusukela enqubweni kuya kusokhethi. Konke kulula njengesibhamu sokuhlasela saseKalashnikov.

Ngokufanelekile, kunomthwalo omningi walo msebenzi onembobo ezenzakalelayo:

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

Yebo, ngokufanelekile, umsebenzi omisa iseva nawo awusho lutho, uphazamisa iluphu yaphakade, wephula isimo sawo.

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

Ngeke nginikeze amakilasi okuhlola lapha, angezansi - abakwenzayo nje ukuhlola ukusebenza kwezindlela zomphakathi. Konke ku-git.

Ukufingqa, ngobusuku obubodwa ungaqonda imigomo yokusebenza kwezinsiza eziyinhloko ze-console. Manje, lapho sithumela i-telenet kukhompuyutha ekude, siyaqonda ukuthi kwenzekani - umlingo unyamalele)

Ngakho, izixhumanisi:
Yonke imithombo yayikhona, ikhona futhi izoba lapha
Mayelana ne-Telnet
Funda kabanzi ngombungazi, u Telnet

Source: www.habr.com

Engeza amazwana