Qorista software oo leh shaqeynta adeegyada macmiilka-server Windows, qaybta 02

Sii wadida maqaallada taxanaha ah ee u heellan fulinta caadada u ah adeegyada konsole ee Windows, kama caawin karno inaan taabano TFTP (Protocol wareejinta Faylka fudud) - nidaam wareejinta faylka fudud.

Sidii markii ugu dambaysay, aynu si kooban u dulmarno aragtida, aragno koodka fulinaya shaqada oo la mid ah kan loo baahan yahay, oo aan falanqayno. Faahfaahin dheeraad ah - hoos goynta

Ma koobi doono koobi maayo macluumaadka tixraaca, isku xirka kuwaas oo dhaqan ahaan laga heli karo dhamaadka maqaalka, waxaan dhihi doonaa oo kaliya in xudunta u ah, TFTP waa kala duwanaansho la fududeeyay ee borotokoolka FTP, kaas oo goobta xakamaynta gelitaanka ay leedahay. laga saaray, run ahaantiina ma jiraan wax halkan ah marka laga reebo amarrada helitaanka iyo wareejinta faylka . Si kastaba ha ahaatee, si ay u sameeyaan our fulinta wax yar ka sii xarrago leh oo la jaan qaadaya mabaadi'da hadda ee code qoraalka, syntax ayaa wax yar la bedelay - tani ma beddeleyso mabaadi'da hawlgalka, laakiin interface ah, IMHO, noqdo wax yar ka badan macquul ah iyo wuxuu isku daraa dhinacyada togan ee FTP iyo TFTP.

Gaar ahaan, markii la bilaabay, macmiilku wuxuu codsadaa cinwaanka IP-ga ee server-ka iyo dekedda kaas oo TFTP-ga caadiga ah uu furan yahay (sababtoo ah la-qabsi la'aanta nidaamka caadiga ah, waxaan u arkay inay ku habboon tahay in laga tago isticmaalaha awoodda uu ku dooranayo deked), ka dib a isku xirka ayaa dhaca, taas oo ay sabab u tahay in macmiilku u soo diri karo mid ka mid ah amarrada - hel ama geli, si uu u helo ama u diro fayl server-ka. Dhammaan faylasha waxaa lagu soo diraa qaabka binary si loo fududeeyo macquulka.

Si loo hirgeliyo borotokoolka, dhaqan ahaan waxaan isticmaalay 4 fasal:

  • TFTPClient
  • TFTPSserver
  • TFTPClientTester
  • TFTPServerTester

Sababtoo ah xaqiiqda ah in fasallada imtixaanku ay u jiraan oo kaliya in lagu saxo kuwa ugu muhiimsan, ma falanqeyn doono, laakiin koodhka ayaa ku jiri doona kaydka; xiriirinta waxaa laga heli karaa dhammaadka maqaalka. Hadda waxaan eegi doonaa fasalada ugu muhiimsan.

TFTPClient

Shaqada fasalkani waa in lagu xidho server-ka fog ee ip iyo lambarka dekedda, akhri amarka qulqulka gelinta (xaaladdan, kiiboodhka), kala saar, u wareeji serverka, iyo, iyada oo ku xidhan haddii aad rabto. u baahan tahay inaad dirto ama hesho fayl, wareejiso ama hesho.

Koodhka bilaabista macmiilka si uu ugu xidho server-ka oo uu sugo amar ka imanaya qulqulka wax gelinta ayaa u eeg sidan. Tiro doorsoomayaal caalami ah oo halkan lagu isticmaalo ayaa lagu sifeeyay meel ka baxsan maqaalka, qoraalka buuxa ee barnaamijka. Wax-yaraantooda awgeed, uma soo xigto si aanay maqaalka u badin.

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

Aan dulmarno hababka loo yaqaan block of code:

Halkan faylka ayaa loo diraa - iyadoo la adeegsanayo scanner, waxaanu u soo bandhigaynaa waxa ku jira faylka sida hannaan bytes ah, kaas oo aan mid mid ugu qorno godka, ka dib markaanu xirno oo dib u furno (maaha xalka ugu cad, laakiin waxay dammaanad qaadaysaa sii deynta kheyraadka), ka dib markaa waxaan soo bandhignaa fariin ku saabsan wareejinta guusha leh.

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

Koodhkan jajaban wuxuu qeexayaa ka soo celinta xogta serverka. Wax kastaa mar labaad waa wax fudud, kaliya qaybta koowaad ee code ayaa xiiso leh. Si aad si sax ah u fahamto inta bytes ee u baahan in laga akhriyo godka, waxaad u baahan tahay inaad ogaato inta uu le'eg yahay miisaanka faylka la wareejiyay. Cabbirka feylka ee server-ka waxa uu u taagan yahay integer dheer, marka 4 bytes ayaa halkan laga aqbalayaa, kuwaas oo markii dambe loo beddelay hal lambar. Tani ma aha hab Java aad u badan, waxay la mid tahay SI, laakiin waxay xallisaa dhibkeeda.

Kadib wax waliba waa wax aan macquul ahayn - waxaan ka helnaa tiro la yaqaan oo bytes ah godka oo ku qor faylka, ka dib markaa waxaan muujineynaa fariinta guusha.

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

Haddii amar aan ahayn helid ama la geliyay la geliyo daaqadda macmiilka, shaqada showErrorMessage ayaa la wici doonaa, taasoo muujinaysa in wax gelinta aysan sax ahayn. Wax-yar-yar awgeed, ma sheegi doono. Waxooga xiiso badan ayaa ah shaqada helitaanka iyo kala qaybinta xadhigga wax gelinta. Waxaan u gudubnaa iskaanka, kaas oo aan ka fileyno in aan helno xariiq u dhexeeya laba boos oo ka kooban amarka, ciwaanka isha iyo ciwaanka.

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

Diridda amar-ku gudbiya amarka laga soo galay iskaanka ilaa godka oo ku qasbaya in la diro

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

Xulle waa hawl go'aamisa ficillada barnaamijka iyadoo ku xiran xargaha la geliyey. Wax kasta oo halkan ku yaal maaha mid aad u qurux badan oo khiyaanada loo isticmaalo maaha midda ugu fiican ee qasabka ah ee ka baxsan xannibaadda koodka, laakiin sababta ugu weyn ee tani waa maqnaanshaha Java ee waxyaabaha qaarkood, sida ergooyinka C #, tilmaamayaasha shaqada ee C ++, ama at ugu yaraan goto aad u xun oo laga cabsado, kaas oo kuu ogolaanaya inaad tan si qurux badan u hirgeliso. Haddii aad taqaanid sida loo sameeyo koodhka wax yar oo qurux badan, waxaan soo dhaweynayaa dhaleeceynta faallooyinka. Waxay iila muuqataa in halkan looga baahan yahay qaamuuska String-delegate, laakiin ma jiro ergo...

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

TFTPSserver

Shaqada server-ku way ka duwan tahay shaqeynta macmiilka, guud ahaan, kaliya amarradaas oo aan ka iman kumbuyuutarka, laakiin ka soo jeeda godka. Qaar ka mid ah hababka guud ahaan waa isku mid, markaa ma soo xigan doono, kaliya waxaan taaban doonaa farqiga.

Si loo bilaabo, habka orodka ayaa la isticmaalaa, kaas oo hela deked ahaan sida gelinta oo ka baaraandegta xogta gelinta ee godka wareegga weligeed ah.

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

Habka loo dhigo, kaas oo ku duuba habka writeToFileFromSocket kaas oo furaya qulqulka qorista ee faylka oo ka qora dhammaan bytes-ka godka, wuxuu soo bandhigayaa fariin tilmaamaysa dhamaystirka guusha ee wareejinta marka qorista dhammaato.

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

Habka helitaanka ayaa soo celiya faylka serverka. Sida hore loogu sheegay qaybta dhinaca macmiilka ee barnaamijka, si aad si guul leh ugu wareejiso faylka waxaad u baahan tahay inaad ogaato cabbirkiisa, ku kaydsan tiro dheer, markaa waxaan u kala qaybiyaa 4 bytes, ku wareeji byte-by-byte. ilaa godka, ka dibna, markaan helay oo ku soo ururiyay macmiilka lambar dib u celin, waxaan ku wareejinayaa dhammaan bytes-ka ka kooban faylka, akhriyay qulqulka gelinta ee faylka.


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

Habka getAndParseInput wuxuu la mid yahay macmiilka, farqiga kaliya ee u dhexeeya ayaa ah inuu akhriyo xogta godka halkii uu ka akhrin lahaa kiiboodhka. Koodhku wuxuu ku yaalaa kaydka, sida xulashada
Xaaladdan oo kale, bilawga waxaa lagu dhejiyaa xannibaad gaar ah oo kood ah, sababtoo ah Hirgelintan gudaheeda, ka dib marka wareejinta la dhammeeyo, agabka waa la sii daayaa oo dib ayaa loo hayaa - mar labaad si looga ilaaliyo daadinta xusuusta.

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

Soo koobid:

Waxaan hadda ku qornay kala duwanaansho noo gaar ah hab-maamuuska wareejinta xogta fudud waxaanan ogaannay sida ay tahay inay u shaqeyso. Mabda 'ahaan, halkan kumaan helin Ameerika, wax badan oo cusubna kuma qorin, laakiin ma jiraan maqaallo la mid ah HabrΓ©, iyo qayb ka mid ah qorista maqaallo taxane ah oo ku saabsan adeegyada cmd waa suurtagal inaan la taaban.

Tixraacyada:

Kaydka koodka isha
Si kooban oo ku saabsan TFTP
Wax la mid ah, laakiin Ruush

Source: www.habr.com

Add a comment