Ekri lojisyèl ak fonksyonalite Windows kliyan-sèvè sèvis piblik, pati 01

Bonjou.

Jodi a mwen ta renmen gade nan pwosesis la nan ekri aplikasyon kliyan-sèvè ki fè fonksyon yo nan sèvis piblik estanda Windows, tankou Telnet, TFTP, elatriye, elatriye nan pi Java. Li klè ke mwen pa pral pote anyen nouvo - tout sèvis piblik sa yo te travay avèk siksè pou plis pase yon ane, men mwen kwè ke pa tout moun konnen sa k ap pase anba kapo a.

Sa a se egzakteman sa yo pral diskite anba koupe a.

Nan atik sa a, yo nan lòd yo pa trennen li deyò, anplis enfòmasyon jeneral, mwen pral sèlman ekri sou sèvè Telnet la, men nan moman sa a gen tou materyèl sou lòt sèvis piblik - li pral nan plis pati nan seri a.

Premye a tout, ou bezwen konnen ki sa Telnet se, ki sa li nesesè pou, ak ki sa li itilize pou. Mwen pa pral site sous mo pou mo (si sa nesesè, mwen pral tache yon lyen nan materyèl sou sijè a nan fen atik la), mwen pral sèlman di ke Telnet bay aksè aleka nan liy lan lòd nan aparèy la. An jeneral, sa a se kote fonksyonalite li yo fini (mwen fè espre kenbe an silans sou aksè nan pò sèvè a; plis sou sa pita). Sa vle di ke pou aplike li, nou bezwen aksepte yon liy sou kliyan an, pase li nan sèvè a, eseye pase li nan liy lòd la, li repons liy lòd la, si gen youn, pase li tounen bay kliyan an ak montre li sou ekran an, oswa, si gen erè, fè itilizatè a konnen ke gen yon bagay ki mal.

Pou aplike pi wo a, kòmsadwa, nou bezwen 2 klas k ap travay ak kèk klas tès ki soti nan ki nou pral lanse sèvè a ak atravè ki kliyan an ap travay.
An konsekans, nan moman sa a estrikti aplikasyon an gen ladan:

  • TelnetClient
  • TelnetClientTester
  • TelnetServer
  • TelnetServerTester

Ann ale nan chak nan yo:

TelnetClient

Tout klas sa a ta dwe kapab fè se voye kòmandman resevwa epi montre repons yo resevwa. Anplis de sa, ou bezwen kapab konekte nan yon pò abitrè (jan mansyone pi wo a) nan yon aparèy aleka epi dekonekte soti nan li.

Pou reyalize sa, fonksyon sa yo te aplike:

Yon fonksyon ki pran yon adrès priz kòm yon agiman, ouvè yon koneksyon epi kòmanse kouran antre ak pwodiksyon (varyab kouran yo deklare pi wo a, sous konplè yo nan fen atik la).

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

Surcharge menm fonksyon an, konekte ak pò a default - pou telnet sa a se 23


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

Fonksyon an li karaktè nan klavye a epi voye yo nan priz pwodiksyon an - ki se tipik, nan mòd liy, pa mòd karaktè:


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

Fonksyon an resevwa done ki soti nan priz la epi li montre li sou ekran an


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

Fonksyon an sispann resepsyon done ak transmisyon


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

TelnetServer

Klas sa a dwe gen fonksyonalite pou resevwa yon kòmandman nan yon priz, voye li pou ekzekisyon, epi voye yon repons soti nan lòd la tounen nan priz la. Pwogram nan fè espre pa tcheke done yo D ', paske premyèman, menm nan "bwat telnet" li posib fòma disk la sèvè, ak dezyèmman, pwoblèm nan nan sekirite nan atik sa a se omisyon an prensip, e se poutèt sa pa gen. yon mo sou chifreman oswa SSL.

Gen sèlman 2 fonksyon (youn nan yo twò chaje), epi an jeneral sa a se pa yon pratik trè bon, men nan objektif travay sa a, li te sanble apwopriye pou mwen kite tout bagay jan li ye.

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

    }

Pwogram nan ouvri pò sèvè a, li done ki soti nan li jiskaske li rankontre yon karaktè fen kòmand, pase lòd la nan yon nouvo pwosesis, epi redireksyon pwodiksyon an soti nan pwosesis la nan priz la. Tout bagay se senp tankou yon fizi atak Kalashnikov.

An konsekans, gen yon surcharge pou fonksyon sa a ak yon pò default:

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

Oke, kòmsadwa, fonksyon an ki sispann sèvè a se tou trivial, li entèwonp bouk la p'ap janm fini an, vyole kondisyon li yo.

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

Mwen pa pral bay klas tès yo isit la, yo anba a - tout sa yo fè se tcheke fonksyonalite a nan metòd piblik yo. Tout se sou git la.

Pou rezime, nan yon koup la aswè ou ka konprann prensip yo nan operasyon nan sèvis piblik prensipal yo konsole. Koulye a, lè nou telenet nan yon òdinatè aleka, nou konprann sa k ap pase - maji a te disparèt)

Se konsa, lyen yo:
Tout sous yo te, yo e yo pral isit la
Konsènan Telnet
Plis enfòmasyon sou Telnet

Sous: www.habr.com

Add nouvo kòmantè