Sau software nrog kev ua haujlwm ntawm Windows client-server utilities, ntu 02

Txuas ntxiv cov kab lus tsis tu ncua uas tau mob siab rau kev coj ua ntawm Windows console utilities, peb tsis tuaj yeem pab tab sis kov raws li TFTP (Trivial File Transfer Protocol) - cov ntaub ntawv hloov chaw yooj yim.

Raws li lub sijhawm dhau los, cia peb luv luv dhau qhov kev xav, saib cov cai uas siv cov haujlwm zoo ib yam li qhov xav tau, thiab tshuaj xyuas nws. Xav paub ntau ntxiv - hauv qab txiav

Kuv yuav tsis luam-paste cov ntaub ntawv siv, cov kev sib txuas uas ib txwm tuaj yeem pom nyob rau hauv qhov kawg ntawm tsab xov xwm, Kuv tsuas yog hais tias ntawm nws qhov tseem ceeb, TFTP yog qhov hloov pauv yooj yim ntawm FTP raws tu qauv, uas muaj kev tswj hwm kev nkag mus. raug tshem tawm, thiab qhov tseeb tsis muaj dab tsi ntawm no tsuas yog cov lus txib kom tau txais thiab xa cov ntaub ntawv . Txawm li cas los xij, txhawm rau ua kom peb qhov kev siv me ntsis ntxiv elegant thiab yoog raws li cov hauv paus ntsiab lus ntawm kev sau cov cai tam sim no, cov syntax tau hloov me ntsis - qhov no tsis hloov cov hauv paus ntsiab lus ntawm kev ua haujlwm, tab sis lub interface, IMHO, dhau los ua me ntsis kev xav thiab combines qhov zoo ntawm FTP thiab TFTP.

Tshwj xeeb, thaum pib, tus neeg siv thov tus neeg rau zaub mov tus IP chaw nyob thiab qhov chaw nres nkoj ntawm qhov kev cai TFTP qhib (vim tsis sib haum nrog cov txheej txheem txheej txheem, kuv xav tias nws tsim nyog tso tus neeg siv lub peev xwm los xaiv qhov chaw nres nkoj), tom qab ntawd a kev sib txuas tshwm sim, raws li qhov tshwm sim ntawm cov neeg siv khoom tuaj yeem xa ib qho ntawm cov lus txib - tau txais lossis muab tso, kom tau txais lossis xa cov ntaub ntawv mus rau lub server. Tag nrho cov ntaub ntawv raug xa mus rau hauv binary hom kom yooj yim lub logic.

Txhawm rau ua raws li txoj cai, kuv ib txwm siv 4 chav kawm:

  • TFTClient
  • TFTPS server
  • TFTClientTester
  • TFTPServerTester

Vim lub fact tias kev xeem cov chav kawm muaj tsuas yog rau debugging lub ntsiab sawv daws yuav, kuv yuav tsis soj ntsuam lawv, tab sis cov cai yuav nyob rau hauv lub repository; Tam sim no kuv yuav saib cov chav kawm tseem ceeb.

TFTClient

Lub luag haujlwm ntawm chav kawm no yog txuas mus rau cov chaw taws teeb tswj uas siv nws tus ip thiab tus lej chaw nres nkoj, nyeem cov lus txib los ntawm cov kwj nkag (qhov no, cov keyboard), txheeb xyuas nws, hloov mus rau lub server, thiab, nyob ntawm seb koj yuav tsum xa lossis tau txais cov ntaub ntawv, hloov nws lossis tau txais.

Cov cai rau kev tso tawm tus neeg siv khoom txuas mus rau lub server thiab tos rau cov lus txib los ntawm cov kwj nkag zoo li no. Ib tug xov tooj ntawm lub ntiaj teb no variables uas siv no yog piav nyob rau hauv sab nraum tsab xov xwm, nyob rau hauv tag nrho cov ntawv nyeem ntawm qhov kev pab cuam. Vim lawv qhov tsis tseem ceeb, kuv tsis hais lawv kom tsis txhob overload tsab xov xwm.

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

Cia peb mus hla cov txheej txheem hu ua hauv qhov thaiv ntawm cov cai no:

Ntawm no cov ntaub ntawv raug xa mus - siv lub scanner, peb nthuav tawm cov ntsiab lus ntawm cov ntaub ntawv raws li ib qho array ntawm bytes, uas peb sau ib tug los ntawm ib tug mus rau lub qhov (socket), tom qab uas peb kaw nws thiab qhib nws dua (tsis yog qhov kev daws teeb meem tshaj plaws, tab sis. nws lav qhov kev tso tawm ntawm cov peev txheej), tom qab ntawd peb tso cov lus hais txog kev hloov pauv tau zoo.

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

Cov kab lus no piav qhia txog kev khaws cov ntaub ntawv los ntawm lub server. Txhua yam yog qhov tsis tseem ceeb dua, tsuas yog thawj qhov thaiv ntawm code yog txaus siab. Yuav kom nkag siab raws nraim pes tsawg bytes yuav tsum tau nyeem los ntawm lub qhov (socket), koj yuav tsum paub seb cov ntaub ntawv hloov pauv hnyav npaum li cas. Cov ntaub ntawv loj ntawm tus neeg rau zaub mov yog sawv cev ua tus lej ntev, yog li 4 bytes raug lees txais ntawm no, uas tau hloov dua siab tshiab rau hauv ib tus lej. Qhov no tsis yog Java mus kom ze, nws zoo ib yam rau SI, tab sis nws daws nws qhov teeb meem.

Tom qab ntawd txhua yam tsis tseem ceeb - peb tau txais cov lej paub ntawm bytes los ntawm lub qhov (socket) thiab sau rau hauv cov ntaub ntawv, tom qab ntawd peb tso cov lus ua tiav.

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

Yog hais tias ib qho lus txib uas tsis yog tau txais lossis muab tso rau hauv tus neeg siv lub qhov rais, showErrorMessage yuav raug hu ua, qhia tias cov tswv yim tsis raug. Vim qhov tsis tseem ceeb, kuv yuav tsis hais nws. Ib qho nthuav me ntsis yog qhov ua haujlwm ntawm kev txais thiab faib cov hlua nkag. Peb dhau lub scanner rau hauv nws, los ntawm qhov peb xav kom tau txais ib kab sib cais los ntawm ob qhov chaw thiab muaj cov lus txib, qhov chaw nyob thiab qhov chaw nyob.

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

Xa cov lus txib - xa cov lus txib nkag los ntawm lub scanner mus rau lub qhov (socket) thiab yuam kom xa mus

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

Ib tug selector yog ib txoj haujlwm uas txiav txim siab qhov kev ua haujlwm nyob ntawm txoj hlua nkag. Txhua yam ntawm no tsis zoo nkauj heev thiab kev ua kom yuam kev siv tsis yog qhov zoo tshaj plaws nrog kev yuam tawm sab nraum lub chaws thaiv, tab sis qhov laj thawj tseem ceeb rau qhov no yog qhov tsis muaj hauv Java ntawm qee yam, xws li cov neeg sawv cev hauv C #, cov ntsiab lus ntawm C ++, lossis ntawm tsawg kawg yog qhov txaus ntshai thiab txaus ntshai goto, uas tso cai rau koj los ua qhov no zoo nkauj. Yog tias koj paub yuav ua li cas ua kom cov cai me ntsis ntxiv elegant, kuv zoo siab tos txais kev thuam hauv cov lus. Zoo li kuv xav tau ib phau ntawv txhais lus String-delegate ntawm no, tab sis tsis muaj tus sawv cev ...

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

TFTPS server

Kev ua haujlwm ntawm tus neeg rau zaub mov txawv ntawm kev ua haujlwm ntawm tus neeg siv khoom, los ntawm thiab loj, tsuas yog hauv cov lus txib tuaj rau nws tsis yog los ntawm cov keyboard, tab sis los ntawm lub qhov (socket). Qee txoj hauv kev feem ntau zoo ib yam, yog li kuv yuav tsis hais lawv, Kuv tsuas yog kov ntawm qhov sib txawv.

Txhawm rau pib, txoj kev khiav yog siv, uas tau txais qhov chaw nres nkoj raws li cov tswv yim thiab ua cov ntaub ntawv tawm tswv yim los ntawm lub qhov (socket) hauv lub voj nyob mus ib txhis.

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

Txoj kev muab tso, uas qhwv txoj kev writeToFileFromSocket uas qhib cov kwj sau rau hauv cov ntaub ntawv thiab sau tag nrho cov tswv yim bytes ntawm lub qhov (socket), qhia cov lus qhia txog kev ua tiav ntawm kev hloov pauv thaum sau tiav.

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

Txoj kev tau txais retrieves cov ntaub ntawv server. Raws li twb tau hais nyob rau hauv ntu ntawm tus neeg siv khoom ntawm qhov kev pab cuam, kom ua tiav cov ntaub ntawv koj yuav tsum paub nws qhov loj me, khaws cia rau hauv tus lej ntev, yog li kuv faib nws mus rau hauv ib qho array ntawm 4 bytes, hloov lawv byte-by-byte. mus rau lub qhov (socket), thiab tom qab ntawd, tau txais thiab sib sau ua ke ntawm tus neeg siv khoom rau hauv tus lej rov qab, kuv hloov tag nrho cov bytes uas tsim cov ntaub ntawv, nyeem los ntawm cov dej nkag los ntawm cov ntaub ntawv.


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

Txoj kev getAndParseInput yog tib yam li hauv cov neeg siv khoom, qhov sib txawv tsuas yog tias nws nyeem cov ntaub ntawv los ntawm lub qhov (socket) es tsis yog los ntawm cov keyboard. Cov cai yog nyob rau hauv lub repository, ib yam li selector.
Nyob rau hauv cov ntaub ntawv no, lub initialization yog muab tso rau hauv ib tug cais block ntawm code, vim hais tias nyob rau hauv qhov kev siv no, tom qab kev hloov pauv tiav, cov peev txheej raug tso tawm thiab rov ua dua tshiab - dua los muab kev tiv thaiv tiv thaiv kev nco.

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

Los xaus:

Peb nyuam qhuav sau peb tus kheej kev hloov pauv ntawm cov ntaub ntawv hloov chaw yooj yim thiab nrhiav seb nws yuav tsum ua haujlwm li cas. Hauv txoj ntsiab cai, kuv tsis pom Asmeskas nyob ntawm no thiab tsis tau sau ntau yam tshiab, tab sis tsis muaj cov ntawv zoo sib xws ntawm HabrΓ©, thiab ua ib feem ntawm kev sau cov kab lus hais txog cov khoom siv cmd nws tsis tuaj yeem kov nws.

Links:

Source code repository
Luv luv txog TFTP
Tib yam, tab sis nyob rau hauv Russia

Tau qhov twg los: www.hab.com

Ntxiv ib saib