Rubutun software tare da ayyuka na kayan aikin abokin ciniki-uwar garken Windows, Sashe na 02

Ci gaba da jerin labaran da aka sadaukar don aiwatar da al'ada na kayan aikin wasan bidiyo na Windows, ba za mu iya taimakawa ba face taɓa TFTP (Trivial File Transfer Protocol) - ƙa'idar canja wurin fayil mai sauƙi.

Kamar yadda na ƙarshe, bari mu ɗan ɗan ɗanɗana ka'idar, mu ga lambar da ke aiwatar da ayyuka kama da wanda ake buƙata, sannan mu bincika ta. Ƙarin cikakkun bayanai - a ƙarƙashin yanke

Ba zan kwafa-manna bayanan tunani ba, hanyoyin haɗin da za a iya samun su bisa ga al'ada a ƙarshen labarin, zan ce kawai a ainihin sa, TFTP shine sauƙaƙan bambancin ka'idar FTP, wanda saitin kula da shiga yana da. An cire, kuma a gaskiya babu wani abu a nan sai umarni don karba da canja wurin fayil . Duk da haka, domin mu aiwatar da mu kadan more m da kuma saba da halin yanzu ka'idodin rubuce-rubucen code, da syntax da aka dan kadan canza - wannan ba ya canza ka'idodin aiki, amma dubawa, IMHO, ya zama dan kadan mafi ma'ana da kuma m. ya haɗa abubuwa masu kyau na FTP da TFTP.

Musamman ma, lokacin da aka ƙaddamar, abokin ciniki yana buƙatar adireshin IP na uwar garken da tashar jiragen ruwa wanda TFTP na al'ada ke buɗe (saboda rashin daidaituwa tare da daidaitattun ka'idojin, na yi la'akari da dacewa don barin mai amfani da ikon zaɓar tashar jiragen ruwa), bayan haka haɗi yana faruwa, sakamakon abin da abokin ciniki zai iya aika ɗaya daga cikin umarni - samu ko sanya, karɓa ko aika fayil zuwa uwar garke. Ana aika duk fayiloli a yanayin binary don sauƙaƙa dabaru.

Don aiwatar da ƙa'idar, a al'ada na yi amfani da azuzuwan 4:

  • TFTPClient
  • TFTPSserver
  • TFTPClientTester
  • TFTPSserverTester

Saboda gaskiyar cewa azuzuwan gwaji sun wanzu kawai don gyara manyan abubuwan, ba zan bincika su ba, amma lambar za ta kasance a cikin ma'ajin; ana iya samun hanyar haɗin kai a ƙarshen labarin. Yanzu zan kalli manyan azuzuwan.

TFTPClient

Ayyukan wannan aji shine haɗawa zuwa uwar garken nesa ta ip da lambar tashar jiragen ruwa, karanta umarni daga rafi na shigarwa (a cikin wannan yanayin, maballin keyboard), rarraba shi, canza shi zuwa uwar garken, kuma, dangane da ko kuna. buƙatar aikawa ko karɓar fayil, canja wurin shi ko samu.

Lambar don ƙaddamar da abokin ciniki don haɗi zuwa uwar garken kuma jira umarni daga rafi na shigarwa yayi kama da wannan. An bayyana adadin ma'auni na duniya da ake amfani da su a nan a waje da labarin, a cikin cikakken rubutun shirin. Saboda rashin girman su, ban kawo su ba don kada su yi yawa akan labarin.

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

Bari mu wuce hanyoyin da ake kira a cikin wannan block na code:

Anan an aika fayil ɗin - ta amfani da na'urar daukar hotan takardu, muna gabatar da abubuwan da ke cikin fayil ɗin a matsayin tsararrun bytes, wanda muke rubuta ɗaya bayan ɗaya zuwa soket, bayan haka kuma mu rufe shi kuma mu sake buɗe shi (ba mafi kyawun bayani ba, amma ba a bayyane yake ba. yana ba da garantin sakin albarkatu), bayan haka muna nuna saƙo game da canja wuri mai nasara.

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

Wannan guntun lambar yana bayyana maido bayanai daga uwar garken. Komai ya sake zama maras muhimmanci, kawai toshe na farko na lambar yana da sha'awa. Don fahimtar ainihin adadin bytes ɗin da ake buƙatar karantawa daga soket, kuna buƙatar sanin girman girman fayil ɗin da aka canjawa wuri. Girman fayil ɗin akan uwar garken ana wakilta shi azaman dogon lamba, don haka ana karɓar bytes 4 anan, waɗanda daga baya aka canza su zuwa lamba ɗaya. Wannan ba tsarin Java ba ne, yana kama da SI, amma yana magance matsalarsa.

Sa'an nan duk abin da ba shi da muhimmanci - muna karɓar sanannun adadin bytes daga soket kuma mu rubuta su zuwa fayil, bayan haka muna nuna saƙon nasara.

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

Idan an shigar da wani umarni ban da samu ko sa a cikin taga abokin ciniki, aikin showErrorMessage za a kira shi, yana nuna cewa shigarwar ba daidai bane. Saboda rashin hankali, ba zan buga shi ba. Wani ɗan ban sha'awa shine aikin karɓa da rarrabuwar igiyar shigarwa. Mun shigar da na'urar daukar hotan takardu a cikinsa, daga inda muke tsammanin samun layin da aka raba ta wurare biyu kuma yana dauke da umarni, adireshin tushe da adireshin wurin.

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

Aika umarni-yana watsa umarnin da aka shigar daga na'urar daukar hotan takardu zuwa soket kuma ya tilasta a aika shi

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

Zaɓin aiki ne wanda ke ƙayyade ayyukan shirin dangane da igiyar da aka shigar. Duk abin da ke nan ba shi da kyau sosai kuma dabarar da aka yi amfani da ita ba ita ce mafi kyau tare da tilasta fita waje da lambar toshe ba, amma babban dalilin wannan shine rashin Java na wasu abubuwa, kamar wakilai a cikin C #, masu nuna aikin daga C ++, ko a akalla mummunan goto mai ban tsoro, wanda ke ba ku damar aiwatar da wannan da kyau. Idan kun san yadda ake yin lambar ta ɗan ƙara kyau, Ina maraba da zargi a cikin sharhi. Da alama a gare ni ana buƙatar ƙamus na String-delegate a nan, amma babu wakilai...

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

TFTPSserver

Ayyukan uwar garken sun bambanta da aikin abokin ciniki, gaba ɗaya, kawai a cikin wannan umarni ba su zo daga maballin ba, amma daga soket. Wasu hanyoyin gaba daya iri daya ne, don haka ba zan kawo su ba, zan tabo bambance-bambance ne kawai.

Don farawa, ana amfani da hanyar gudu, wanda ke karɓar tashar jiragen ruwa azaman shigarwa kuma yana sarrafa bayanan shigarwa daga soket a cikin madauki na har abada.

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

Hanyar da aka saka, wacce ke nannade hanyar rubutaToFileFromSocket wacce ke buɗe rafi na rubutu zuwa fayil kuma ya rubuta duk bayanan shigarwa daga soket, yana nuna saƙon da ke nuna nasarar kammala canja wuri lokacin da rubutun ya ƙare.

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

Hanyar samun tana maido da fayil ɗin uwar garken. Kamar yadda aka riga aka ambata a cikin ɓangaren ɓangaren abokin ciniki na shirin, don samun nasarar canja wurin fayil kuna buƙatar sanin girmansa, wanda aka adana a cikin dogon lamba, don haka sai na raba shi zuwa tsararru na bytes 4, canza su byte-byte. zuwa soket, sa'an nan, bayan karba da kuma tattara su a kan abokin ciniki cikin lamba baya, na canja wurin duk bytes da ke cikin fayil ɗin, karanta daga rafi na shigarwa daga fayil ɗin.


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

Hanyar samunAndParseInput iri ɗaya ce da ta abokin ciniki, bambancin kawai shine karanta bayanai daga soket maimakon daga madannai. Lambar tana cikin ma'ajiyar, kamar mai zaɓe.
A wannan yanayin, ana sanya ƙaddamarwa a cikin wani shinge na lamba daban, saboda a cikin wannan aiwatarwa, bayan an gama canja wurin, ana fitar da albarkatu kuma an sake mamaye su - kuma don ba da kariya daga leken ƙwaƙwalwa.

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

Don taƙaitawa:

Mun riga mun rubuta bambancin namu akan ƙa'idar canja wurin bayanai mai sauƙi kuma mun gano yadda yakamata ta yi aiki. A ka'ida, ban gano Amurka a nan ba kuma ban rubuta sababbin abubuwa da yawa ba, amma babu irin wannan labarin akan Habré, kuma a matsayin ɓangare na rubuta jerin labaran game da abubuwan amfani na cmd ba shi yiwuwa a taɓa shi.

Tunani:

Ma'ajiyar lambar tushe
A taƙaice game da TFTP
Haka abu, amma a cikin Rashanci

source: www.habr.com

Add a comment