Bogearraí scríbhneoireachta le feidhmiúlacht fóntais cliant-freastalaí Windows, cuid 01

Beannachtaí.

Sa lá atá inniu ba mhaith liom breathnú ar an bpróiseas a bhaineann le hiarratais cliant-freastalaí a scríobh a chomhlíonann feidhmeanna fóntais chaighdeánacha Windows, mar shampla Telnet, TFTP, et cetera, et cetera i Java íon. Is léir nach dtabharfaidh mé aon rud nua liom - tá na fóntais seo go léir ag obair go rathúil le níos mó ná bliain amháin, ach creidim nach bhfuil a fhios ag gach duine cad atá ar siúl faoin gcochall.

Seo go díreach a bheidh á phlé faoin ghearradh.

San Airteagal seo, d'fhonn gan é a tharraingt amach, chomh maith le faisnéis ghinearálta, ní scríobhfaidh mé ach faoi fhreastalaí Telnet, ach faoi láthair tá ábhar ann freisin ar fhóntais eile - beidh sé i gcodanna breise den tsraith.

Ar an gcéad dul síos, ní mór duit a dhéanamh amach cad é Telnet, cad is gá dó, agus cad a úsáidtear é. Ní luafaidh mé foinsí focal ar fhocal (más gá, cuirfidh mé nasc le hábhair ar an ábhar ag deireadh an ailt), ní déarfaidh mé ach go soláthraíonn Telnet cianrochtain ar líne ordaithe na feiste. Tríd is tríd, is é seo an áit a chríochnaíonn a fheidhmiúlacht (bhí mé tostach d'aon ghnó maidir le rochtain a fháil ar an gcalafort freastalaí; tuilleadh faoi sin níos déanaí). Ciallaíonn sé seo chun é a chur i bhfeidhm, ní mór dúinn glacadh le líne ar an gcliant, é a chur ar aghaidh chuig an bhfreastalaí, iarracht a dhéanamh é a chur ar aghaidh chuig an líne ordaithe, léigh freagra na n-orduithe, má tá ceann ann, cuir ar ais chuig an gcliant é agus taispeáin ar an scáileán é, nó, má dhéantar earráidí, cuir in iúl don úsáideoir go bhfuil rud éigin mícheart.

Chun an méid thuas a chur i bhfeidhm, dá réir sin, ní mór dúinn 2 rang oibre agus roinnt rang tástála as a sheolfaimid an freastalaí agus trína n-oibreoidh an cliant.
Dá réir sin, i láthair na huaire cuimsíonn struchtúr an iarratais:

  • TelnetClient
  • TelnetClientTester
  • Freastalaí Telnet
  • TelnetServerTester

A ligean ar dul trí gach ceann acu:

TelnetClient

Ba chóir go mbeadh an rang seo ar fad in ann orduithe faighte a sheoladh agus na freagraí a fuarthas a thaispeáint. Ina theannta sin, ní mór duit a bheith in ann ceangal le calafort treallach (mar a luadh thuas) de ghléas cianda agus dínascadh uaidh.

Chun é seo a bhaint amach, cuireadh na feidhmeanna seo a leanas i bhfeidhm:

Feidhm a ghlacann seoladh soicéad mar argóint, a osclaíonn nasc agus a thosaíonn sruthanna ionchuir agus aschuir (dearbhaítear athróga srutha thuas, tá foinsí iomlána ag deireadh an ailt).

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

An fheidhm chéanna á ró-ualú, ag nascadh leis an gcalafort réamhshocraithe - le haghaidh telnet is é seo 23


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

Léann an fheidhm carachtair ón méarchlár agus seolann chuig an soicéad aschuir iad - rud atá tipiciúil, i mód líne, ní mód carachtair:


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

Faigheann an fheidhm sonraí ón soicéad agus taispeánann sé ar an scáileán é


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

Stopann an fheidhm fáiltiú agus tarchur sonraí


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

Freastalaí Telnet

Caithfidh feidhm a bheith ag an aicme seo ordú a fháil ó shoicéad, é a sheoladh lena fhorghníomhú, agus freagra ón ordú a sheoladh ar ais go dtí an soicéad. Ní dhéanann an clár na sonraí ionchuir a sheiceáil d’aon ghnó, mar ar dtús, fiú i “boxed telnet” is féidir diosca an fhreastalaí a fhormáidiú, agus sa dara háit, fágtar saincheist na slándála san Airteagal seo ar lár i bprionsabal, agus sin an fáth nach bhfuil ann. focal faoi chriptiú nó SSL.

Níl ach 2 fheidhm ann (tá ceann acu ró-ualach), agus go ginearálta ní cleachtas an-mhaith é seo, ach chun críocha an taisc seo, ba chosúil go raibh sé oiriúnach dom gach rud a fhágáil mar atá sé.

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

    }

Osclaíonn an clár an calafort freastalaí, léann sé sonraí uaidh go dtí go dtagann sé trasna ar charachtar deiridh ordaithe, téann sé an t-ordú chuig próiseas nua, agus atreoraíonn an t-aschur ón bpróiseas chuig an soicéad. Tá gach rud chomh simplí le raidhfil ionsaithe Kalashnikov.

Dá réir sin, tá ró-ualach don fheidhm seo le calafort réamhshocraithe:

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

Bhuel, dá réir sin, tá an fheidhm a stopann an freastalaí freisin fánach, cuireann sé isteach ar an lúb síoraí, ag sárú a riocht.

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

Ní thabharfaidh mé ranganna tástála anseo, tá siad thíos - níl le déanamh acu ach feidhmiúlacht modhanna poiblí a sheiceáil. Tá gach rud ar an git.

Mar achoimre, i gceann cúpla tráthnóna is féidir leat tuiscint a fháil ar na prionsabail a bhaineann le feidhmiú na bpríomhfhóntas consól. Anois, nuair a dhéanaimid teilealíon ar ríomhaire cianda, tuigimid cad atá ag tarlú - tá an draíocht imithe)

Mar sin, na naisc:
Bhí, tá agus beidh gach foinse anseo
Maidir Telnet
Tuilleadh faoi Telnet

Foinse: will.com

Add a comment