Bathar-bog sgrìobhaidh le comas-gnìomh goireasan frithealaiche teachdaiche Windows, pàirt 02

A’ leantainn air adhart leis an t-sreath leantainneach de dh’ artaigilean a tha coisrigte ri buileachadh àbhaisteach de ghoireasan tòcan Windows, chan urrainn dhuinn ar cuideachadh ach suathadh air TFTP (Trivial File Transfer Protocol) - pròtacal gluasad faidhle sìmplidh.

Mar an turas mu dheireadh, rachamaid thairis air an teòiridh gu h-aithghearr, faic an còd a chuireas an gnìomh gnìomhachd coltach ris an fhear a tha a dhìth, agus dèan sgrùdadh air. Barrachd mion-fhiosrachaidh - fon ghearradh

Cha dèan mi lethbhreac-pas a-steach fiosrachadh iomraidh, ceanglaichean ris am faighear gu traidiseanta aig deireadh an artaigil, bidh mi dìreach ag ràdh gu bheil TFTP aig a chridhe mar atharrachadh nas sìmplidhe air protocol FTP, anns a bheil an suidheachadh smachd ruigsinneachd air a thoirt air falbh, agus gu dearbh chan eil dad an seo ach òrdughan airson faidhle fhaighinn agus a ghluasad . Ach, gus ar buileachadh a dhèanamh beagan nas eireachdail agus air atharrachadh gu prionnsapalan gnàthach còd sgrìobhaidh, tha an co-chòrdadh air atharrachadh beagan - chan eil seo ag atharrachadh prionnsapalan obrachaidh, ach bidh an eadar-aghaidh, IMHO, a ’fàs beagan nas loidsigeach agus nas loidsigeach. a’ cothlamadh taobhan adhartach FTP agus TFTP.

Gu sònraichte, nuair a thèid a chuir air bhog, bidh an neach-dèiligidh ag iarraidh seòladh IP an fhrithealaiche agus am port air a bheil TFTP àbhaisteach fosgailte (air sgàth neo-fhreagarrachd leis a’ phròtacal àbhaisteach, bha mi den bheachd gu robh e iomchaidh an comas don neach-cleachdaidh port a thaghadh fhàgail), às deidh sin a bidh ceangal a’ tachairt, agus mar thoradh air an sin faodaidh an neach-dèiligidh aon de na h-òrdughan a chuir - faigh no cuir, gus faidhle fhaighinn no a chuir chun t-seirbheisiche. Thèid a h-uile faidhle a chuir ann am modh binary gus an loidsig a dhèanamh nas sìmplidhe.

Gus am protocol a chuir an gnìomh, chleachd mi 4 clasaichean gu traidiseanta:

  • TFTTPClient
  • TFTPS frithealaiche
  • TTFClient Tester
  • TFTPS Freiceadan Tester

Leis gu bheil clasaichean deuchainn ann dìreach airson na prìomh fheadhainn a dhì-bhugachadh, cha dèan mi mion-sgrùdadh orra, ach bidh an còd anns an stòr; gheibhear ceangal thuige aig deireadh an artaigil. A-nis bheir mi sùil air na prìomh chlasaichean.

TFTTPClient

Is e obair a’ chlas seo ceangal a dhèanamh ri frithealaiche iomallach leis an ip agus àireamh a’ phuirt aige, leugh àithne bhon t-sruth a-steach (sa chùis seo, am meur-chlàr), parsadh e, gluais e chun t-seirbheisiche, agus, a rèir a bheil thu feumaidh tu faidhle a chuir no fhaighinn, a ghluasad no fhaighinn.

Tha an còd airson an neach-dèiligidh a chuir air bhog gus ceangal ris an fhrithealaiche agus feitheamh ri àithne bhon t-sruth inntrigidh a’ coimhead mar seo. Tha grunn chaochladairean cruinneil a thathas a’ cleachdadh an seo air am mìneachadh taobh a-muigh an artaigil, ann an teacsa slàn a’ phrògraim. Air sgàth cho beag ‘s a tha iad, chan eil mi gan ainmeachadh gus nach cuir mi cus air an artaigil.

 public void run(String ip, int port)
    {
        this.ip = ip;
        this.port = port;
        try {
            inicialization();
            Scanner keyboard = new Scanner(System.in);
            while (isRunning) {
                getAndParseInput(keyboard);
                sendCommand();
                selector();
                }
            }
        catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

Rachamaid thairis air na dòighean ris an canar sa bhloc còd seo:

An seo thèid am faidhle a chuir - a ’cleachdadh sganair, bidh sinn a’ taisbeanadh susbaint an fhaidhle mar raon de bytes, a bhios sinn a ’sgrìobhadh aon às deidh aon chun t-socaid, às deidh sin bidh sinn ga dhùnadh agus ga fhosgladh a-rithist (chan e am fuasgladh as fhollaisiche, ach tha e a’ gealltainn gun tèid goireasan a leigeil ma sgaoil), às deidh sin bidh sinn a’ taisbeanadh teachdaireachd mu ghluasad soirbheachail.

private  void put(String sourcePath, String destPath)
    {

        File src = new File(sourcePath);
        try {

            InputStream scanner = new FileInputStream(src);
            byte[] bytes = scanner.readAllBytes();
            for (byte b : bytes)
                sout.write(b);
            sout.close();
            inicialization();
            System.out.println("nDonen");
            }

        catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

Tha a' chriomag còd seo ag innse mu bhith a' faighinn dàta bhon fhrithealaiche. Tha a h-uile dad beag a-rithist, chan eil ach a’ chiad bhloc de chòd inntinneach. Gus tuigsinn gu mionaideach cia mheud bytes a dh'fheumar a leughadh bhon t-socaid, feumaidh fios a bhith agad dè an cuideam a th 'anns an fhaidhle a chaidh a ghluasad. Tha meud an fhaidhle air an fhrithealaiche air a riochdachadh mar iomlanachd fhada, agus mar sin thathar a 'gabhail ri 4 bytes an seo, a thèid an tionndadh gu aon àireamh an dèidh sin. Chan e dòigh-obrach fìor Java a tha seo, tha e caran coltach ri SI, ach tha e a’ fuasgladh a dhuilgheadas.

An uairsin tha a h-uile dad beag - gheibh sinn àireamh aithnichte de bytes bhon t-socaid agus sgrìobh iad gu faidhle, às deidh sin bidh sinn a ’taisbeanadh teachdaireachd soirbheachais.

   private void get(String sourcePath, String destPath){
        long sizeOfFile = 0;
        try {


            byte[] sizeBytes = new byte[Long.SIZE];
           for (int i =0; i< Long.SIZE/Byte.SIZE; i++)
           {
               sizeBytes[i] = (byte)sin.read();
               sizeOfFile*=256;
               sizeOfFile+=sizeBytes[i];
           }

           FileOutputStream writer = new FileOutputStream(new File(destPath));
           for (int i =0; i < sizeOfFile; i++)
           {
               writer.write(sin.read());
           }
           writer.close();
           System.out.println("nDONEn");
       }
       catch (Exception e){
            System.out.println(e.getMessage());
       }
    }

Ma chaidh àithne a bharrachd air faighinn no cuir a-steach don uinneag teachdaiche, thèid an gnìomh showErrorMessage a ghairm, a’ nochdadh gu robh an cuir a-steach ceàrr. Air sgàth cho beag sa tha e, cha bhith mi ga ainmeachadh. Beagan nas inntinniche tha an gnìomh a bhith a’ faighinn agus a’ sgoltadh an t-sreang cuir a-steach. Bheir sinn seachad an sganair a-steach dha, às am bi sinn an dùil loidhne fhaighinn air a sgaradh le dà àite agus anns a bheil an àithne, an seòladh stòr agus an seòladh ceann-uidhe.

    private void getAndParseInput(Scanner scanner)
    {
        try {

            input = scanner.nextLine().split(" ");
            typeOfCommand = input[0];
            sourcePath = input[1];
            destPath = input[2];
        }
        catch (Exception e) {
            System.out.println("Bad input");
        }
    }

A 'cur òrdugh - a' toirt seachad an àithne a chaidh a chur a-steach bhon sganair chun an t-socaid agus a 'toirt air falbh e

    private void sendCommand()
    {
        try {

            for (String str : input) {
                for (char ch : str.toCharArray()) {
                    sout.write(ch);
                }
                sout.write(' ');
            }
            sout.write('n');
        }
        catch (Exception e) {
            System.out.print(e.getMessage());
        }
    }

Is e gnìomh a th’ ann an roghnaichear a bhios a’ dearbhadh gnìomhan a’ phrògraim a rèir an t-sreang a chaidh a chuir a-steach. Chan eil a h-uile dad an seo gu math brèagha agus chan e an cleas a thathar a’ cleachdadh am fear as fheàrr le fàgail èiginneach taobh a-muigh a’ bhloc còd, ach is e am prìomh adhbhar airson seo nach eil cuid de rudan ann an Java, leithid riochdairean ann an C #, comharran gnìomh bho C ++, no aig co-dhiù an goto uamhasach agus uamhasach, a leigeas leat seo a chuir an gnìomh gu breagha. Ma tha fios agad mar a nì thu an còd beagan nas eireachdail, tha mi a’ cur fàilte air càineadh anns na beachdan. Tha e coltach riumsa gu bheil feum air faclair String-riochdaire an seo, ach chan eil riochdaire ann...

    private void selector()
    {
        do{
            if (typeOfCommand.equals("get")){
                get(sourcePath, destPath);
                break;
            }
            if (typeOfCommand.equals("put")){
                put(sourcePath, destPath);
                break;
            }
            showErrorMessage();
        }
        while (false);
    }
}

TFTPS frithealaiche

Tha gnìomhachd an fhrithealaiche eadar-dhealaichte bho ghnìomhachd an neach-dèiligidh, gu ìre mhòr, a-mhàin leis gu bheil òrdughan a’ tighinn thuige chan ann bhon mheur-chlàr, ach bhon t-socaid. Tha cuid de na dòighean san fharsaingeachd mar an ceudna, agus mar sin cha toir mi luaidh orra, cha toir mi iomradh ach air na h-eadar-dhealachaidhean.

Gus tòiseachadh, thathas a ’cleachdadh an dòigh ruith, a gheibh port mar chuir a-steach agus a’ pròiseasadh an dàta cuir a-steach bhon t-socaid ann an lùb shìorraidh.

    public void run(int port) {
            this.port = port;
            incialization();
            while (true) {
                getAndParseInput();
                selector();
            }
    }

Tha an dòigh cuir, a tha a’ cuairteachadh an dòigh writeToFileFromSocket a dh’ fhosglas sruth sgrìobhaidh gu faidhle agus a sgrìobhas a h-uile byte cuir a-steach bhon t-socaid, a’ taisbeanadh teachdaireachd a’ nochdadh gun deach an gluasad a chrìochnachadh gu soirbheachail nuair a bhios an sgrìobhadh deiseil.

    private  void put(String source, String dest){
            writeToFileFromSocket();
            System.out.print("nDonen");
    };
    private void writeToFileFromSocket()
    {
        try {
            FileOutputStream writer = new FileOutputStream(new File(destPath));
            byte[] bytes = sin.readAllBytes();
            for (byte b : bytes) {
                writer.write(b);
            }
            writer.close();
        }
        catch (Exception e){
            System.out.println(e.getMessage());
        }
    }

Bidh an dòigh faighinn a’ toirt air ais faidhle an fhrithealaiche. Mar a chaidh ainmeachadh cheana anns an earrann air taobh an neach-dèiligidh den phrògram, gus faidhle a ghluasad gu soirbheachail feumaidh tu fios a bhith agad air a mheud, air a stòradh ann an sreath fhada, agus mar sin roinn mi e ann an sreath de 4 bytes, gluais iad byte-by-byte chun t-socaid, agus an uairsin, an dèidh dhaibh an neach-dèiligidh fhaighinn agus a chruinneachadh ann an àireamh air ais, bidh mi a’ gluasad a h-uile bytes a tha a ’dèanamh suas am faidhle, air a leughadh bhon t-sruth cuir a-steach bhon fhaidhle.


 private  void get(String source, String dest){
        File sending = new File(source);
        try {
            FileInputStream readFromFile = new FileInputStream(sending);
            byte[] arr = readFromFile.readAllBytes();
            byte[] bytes = ByteBuffer.allocate(Long.SIZE / Byte.SIZE).putLong(sending.length()).array();
            for (int i = 0; i<Long.SIZE / Byte.SIZE; i++)
                sout.write(bytes[i]);
            sout.flush();
            for (byte b : arr)
                sout.write(b);
        }
        catch (Exception e){
            System.out.println(e.getMessage());
        }
    };

Tha an dòigh getAndParseInput an aon rud ris an neach-dèiligidh, is e an aon eadar-dhealachadh gu bheil e a’ leughadh dàta bhon t-socaid seach bhon mheur-chlàr. Tha an còd anns an stòr, dìreach mar roghnaichear.
Anns a 'chùis seo, tha an tùsachadh air a chur ann am bloc còd air leth, oir taobh a-staigh a’ bhuileachadh seo, às deidh an gluasad a chrìochnachadh, thèid goireasan a leigeil ma sgaoil agus ath-ghabhail a-rithist - a-rithist gus dìon a thoirt seachad an aghaidh aodion cuimhne.

    private void  incialization()
    {
        try {
            serverSocket = new ServerSocket(port);
            socket = serverSocket.accept();
            sin = socket.getInputStream();
            sout = socket.getOutputStream();
        }
        catch (Exception e) {
            System.out.print(e.getMessage());
        }
    }

Airson geàrr-chunntas:

Tha sinn dìreach air an atharrachadh againn fhèin a sgrìobhadh air protocol gluasad dàta sìmplidh agus air faighinn a-mach mar a bu chòir dha obrachadh. Ann am prionnsapal, cha do lorg mi Ameireagaidh an seo agus cha do sgrìobh mi mòran rudan ùra, ach cha robh artaigilean coltach ris air Habré, agus mar phàirt de bhith a’ sgrìobhadh sreath de artaigilean mu ghoireasan cmd bha e do-dhèanta gun a bhith a’ suathadh air.

Tùsan:

Stòr còd stòr
Beagan mu dheidhinn TFTP
An aon rud, ach ann an Ruisis

Source: www.habr.com

Cuir beachd ann