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

Ukuqhubeka nochungechunge oluqhubekayo lwama-athikili anikelwe ekusetshenzisweni ngokwezifiso kwezinsiza ze-Windows console, asikwazi ukuzibamba kodwa sithinte i-TFTP (I-Trivial File Transfer Protocol) - umthetho olandelwayo wokudlulisa amafayela.

Okokugcina, ake sihlole ithiyori kafushane, sibone ikhodi esebenzisa ukusebenza okufana naleyo edingekayo, bese siyihlaziya. Imininingwane eyengeziwe - ngaphansi kokunqunywa

Ngeke ngikopishe futhi nginamathisele ulwazi lwereferensi, izixhumanisi ezingatholakala ngokwesiko ekugcineni kwesihloko, ngizosho kuphela ukuthi emnyombweni wayo, i-TFTP iwukuhluka okwenziwe lula kwephrothokholi ye-FTP, lapho ukulungiselelwa kokulawula ukufinyelela isusiwe, futhi empeleni akukho lutho lapha ngaphandle kwemiyalo yokwamukela nokudlulisa ifayela . Kodwa-ke, ukuze senze ukuqaliswa kwethu kube kuhle kakhulu futhi kuhambisane nezimiso zamanje zokubhala ikhodi, i-syntax ishintshiwe kancane - lokhu akuguquli izimiso zokusebenza, kodwa i-interface, i-IMHO, iba nengqondo kancane futhi. ihlanganisa izici ezinhle ze-FTP ne-TFTP.

Ikakhulukazi, lapho yethulwa, iklayenti licela ikheli le-IP leseva kanye nechweba lapho i-TFTP yangokwezifiso ivuliwe (ngenxa yokungahambisani nenqubo evamile, ngibone kufanelekile ukushiya umsebenzisi ikhono lokukhetha ichweba), ngemva kwalokho a ukuxhumana kwenzeka, ngenxa yalokho iklayenti lingathumela omunye wemiyalo - thola noma ubeke, ukwamukela noma ukuthumela ifayela kuseva. Wonke amafayela athunyelwa ngemodi kanambambili ukuze kube lula ukuqonda.

Ukuze ngisebenzise umthetho olandelwayo, ngokwesiko ngangisebenzisa amakilasi ama-4:

  • TFTPClient
  • Iseva ye-TFTPS
  • TFTPClientTester
  • TFTPServerTester

Ngenxa yokuthi amakilasi okuhlola akhona kuphela ukuze kulungiswe amaphutha ayinhloko, ngeke ngiwahlaziye, kodwa ikhodi izoba senqolobaneni; isixhumanisi sayo singatholakala ekupheleni kwesihloko. Manje ngizobheka amakilasi amakhulu.

TFTPClient

Umsebenzi walesi sigaba ukuxhuma kuseva ekude ngenombolo yayo ye-ip kanye nembobo, ufunde umyalo ovela kumfudlana wokufaka (kulokhu, ikhibhodi), uyihlukanise, uyidlulisele kuseva, futhi, kuye ngokuthi udinga ukuthumela noma ukwamukela ifayela, ukulidlulisela noma ukulithola.

Ikhodi yokuqalisa iklayenti ukuze ixhume kuseva bese ilinda umyalo ovela ekusakazweni kokufaka ibonakala kanje. Inani lezinto eziguquguqukayo zomhlaba wonke ezisetshenziswa lapha zichazwe ngaphandle kwe-athikili, embhalweni ogcwele wohlelo. Ngenxa yobuncane bazo, angizicaphuli ukuze ngingasigcwalisi kakhulu lesi sihloko.

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

Ake sibheke izindlela ezibizwa kule block of code:

Lapha ifayela lithunyelwa - kusetshenziswa isithwebuli, sethula okuqukethwe kwefayela njengeqoqo lama-byte, esilibhala ngalinye ngalinye esitokisini, emva kwalokho silivala futhi silivule futhi (hhayi isisombululo esisobala kakhulu, kodwa iqinisekisa ukukhululwa kwezinsiza), ngemva kwalokho sibonise umlayezo mayelana nokudluliswa okuyimpumelelo.

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

Lesi siqeshana sekhodi sichaza ukubuyisa idatha kusuka kuseva. Yonke into iphinde ibe yinto encane, ibhulokhi yokuqala yekhodi kuphela enentshisekelo. Ukuze uqonde kahle ukuthi mangaki amabhayithi adinga ukufundwa kusuka kusokhethi, udinga ukwazi ukuthi ifayela elidlulisiwe linesisindo esingakanani. Usayizi wefayela kuseva uboniswa njengenombolo ende, ngakho amabhayithi angu-4 amukelwa lapha, aguqulelwa kamuva abe inombolo eyodwa. Lena akuyona indlela ye-Java kakhulu, ifana kakhulu ne-SI, kodwa ixazulula inkinga yayo.

Khona-ke yonke into incane - sithola inombolo eyaziwayo yama-byte kusuka esokhethi futhi siyibhale efayeleni, ngemva kwalokho sibonise umlayezo wempumelelo.

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

Uma umyalo ngaphandle kokuthi uthole noma ukufakwa ufakwe efasiteleni leklayenti, umsebenzi we-showErrorMessage uzobizwa, okubonisa ukuthi okokufaka bekungalungile. Ngenxa yobuncane, angizukuyicaphuna. Okuthakasela kakhulu umsebenzi wokwamukela nokuhlukanisa iyunithi yezinhlamvu yokufaka. Sidlulisa isithwebuli kuso, lapho silindele ukuthola khona umugqa ohlukaniswe izikhala ezimbili futhi uqukethe umyalo, ikheli lomthombo kanye nekheli lendawo.

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

Ukuthumela umyalo-kuthumela umyalo ofakwe kusuka kusikena kuya kusokhethi futhi kuwuphoqa ukuba uthunyelwe

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

Isikhethi umsebenzi onquma izenzo zohlelo kuye ngeyunithi yezinhlamvu efakiwe. Konke lapha akukuhle kakhulu futhi iqhinga elisetshenzisiwe alilona elingcono kakhulu eliphuma ngenkani ngaphandle kwebhulokhi yekhodi, kodwa isizathu esiyinhloko salokhu ukungabikho kwe-Java kwezinye izinto, njengezihambeli ku-C #, izinkomba zokusebenza ezivela ku-C ++, noma ku- okungenani i-goto embi nembi, ekuvumela ukuthi usebenzise lokhu kahle. Uma wazi ukuthi ungayenza kanjani ikhodi ibe yinhle kakhulu, ngiyakwamukela ukugxekwa kumazwana. Kimina kubonakala sengathi isichazamazwi se-String-delegate siyadingeka lapha, kodwa asikho isithunywa...

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

Iseva ye-TFTPS

Ukusebenza kweseva kuyahluka ekusebenzeni kweklayenti, ngokujwayelekile, kuphela kulokho imiyalo eza kuyo hhayi kukhibhodi, kodwa kusuka kusokhethi. Ezinye zezindlela ngokuvamile ziyefana, ngakho-ke ngeke ngibalule, ngizothinta kuphela umehluko.

Ukuze kuqalwe, kusetshenziswa indlela yokuqalisa, ethola imbobo njengokungenayo futhi icubungule idatha yokufaka esuka kusokhethi ku-loop yaphakade.

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

Indlela yokubeka, egoqa indlela yokubhalaToFileFromSocket evula umfudlana wokubhala efayeleni futhi ibhale wonke amabhayithi okokufaka ukusuka kusokhethi, ibonisa umlayezo obonisa ukuqedwa ngempumelelo kokudlulisa lapho ukubhala kuqeda.

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

Indlela yokuthola ibuyisa ifayela leseva. Njengoba sekushiwo esigabeni esisohlangothini lweklayenti lohlelo, ukuze udlulise ngempumelelo ifayela udinga ukwazi usayizi walo, eligcinwe enamba ende, ngakho-ke ngilihlukanisa libe uchungechunge lwamabhayithi angu-4, ngiwadlulisele nge-byte-by-byte. esokhethi, bese-ke, sengiwatholile futhi ngiwahlanganise kuklayenti ngenombolo emuva, ngidlulisa wonke ama-byte akha ifayela, afundwe kusuka emfudlaneni wokufaka kusuka efayeleni.


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

Indlela ye-getAndParseInput iyafana neyeklayenti, umehluko kuphela ukuthi ifunda idatha kusokhethi esikhundleni sokusuka kukhibhodi. Ikhodi isendaweni yokugcina, njengesikhethi.
Kulokhu, ukuqaliswa kufakwa endaweni ehlukile yekhodi, ngoba ngaphakathi kwalokhu kuqaliswa, ngemva kokuqedwa kokudluliselwa, izinsiza ziyakhululwa futhi ziphinde zisetshenziswe futhi - futhi ukuze zinikeze isivikelo ekuvuzeni kwememori.

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

Ukufingqa:

Sisanda kubhala okuhlukile kwethu kuphrothokholi yokudluliswa kwedatha elula futhi sathola ukuthi kufanele isebenze kanjani. Empeleni, angizange ngithole iMelika lapha futhi angizange ngibhale izinto eziningi ezintsha, kodwa azikho izihloko ezifanayo ku-HabrΓ©, futhi njengengxenye yokubhala uchungechunge lwezihloko mayelana nezinsiza ze-cmd kwakungenakwenzeka ukuthi ungayithinti.

Izinkomba:

Inqolobane yekhodi yomthombo
Kafushane mayelana ne-TFTP
Into efanayo, kodwa ngesiRashiya

Source: www.habr.com

Engeza amazwana