Kunyora software nekushanda kweWindows client-server utilities, chikamu 02

Kuenderera mberi nekuenderera mberi kwezvinyorwa zvakatsaurirwa kuita tsika yeWindows console zvishandiso, isu hatigone kubatsira asi kubata paTFTP (Trivial File Transfer Protocol) - iri nyore kufambisa faira protocol.

Senguva yekupedzisira, ngatimbofambai muchidimbu pamusoro pedzidziso, ona kodhi iyo inoshandisa kushanda kwakafanana neinodiwa, uye kuiongorora. Mamwe mashoko - pasi pekucheka

Ini handisi kuzokopa-namira referefeta ruzivo, zvinongedzo kune izvo zvinowanzo kuwanikwa pakupera kwechinyorwa, ini ndinongotaura kuti pahupamhi hwayo, TFTP ishanduko yakareruka yeiyo FTP protocol, mune iyo yekuwana kutonga kurongedza ine. zvabviswa, uye chokwadi hapana chinhu pano kunze kwemirairo yekugamuchira uye kutamisa faira . Nekudaro, kuitira kuti kuita kwedu kuita kuwedzere kuyevedza uye kuchinjika kune yazvino misimboti yekunyora kodhi, iyo syntax yakashandurwa zvishoma - izvi hazvishandure misimboti yekushanda, asi iyo interface, IMHO, inova zvishoma zvine musoro uye. inosanganisa zvinhu zvakanaka zveFTP neTFTP.

Kunyanya, kana yatangwa, mutengi anokumbira IP kero ye server uye chiteshi pane iyo tsika TFTP yakavhurika (nekuda kwekusapindirana neyakajairwa protocol, ndakaona zvakakodzera kusiya mushandisi kugona kusarudza chiteshi), mushure meizvozvo a kubatana kunoitika, semhedzisiro iyo mutengi anogona kutumira imwe yemirairo - kuwana kana kuisa, kugamuchira kana kutumira faira kune server. Ese mafaera anotumirwa mumabhinari mode kurerutsa pfungwa.

Kuti ndiite iyo protocol, ini ndaiwanzoshandisa makirasi mana:

  • TFTPClient
  • TFTPSserver
  • TFTPClientTester
  • TFTPServerTester

Nekuda kwekuti makirasi ekuyedza aripo chete ekugadzirisa iwo makuru, ini handisi kuzoaongorora, asi iyo kodhi ichave mune repository; chinongedzo chairi chinogona kuwanikwa pakupera kwechinyorwa. Iye zvino ndichatarisa makirasi makuru.

TFTPClient

Basa rekirasi iyi nderekubatanidza kune iri kure sevha neayo ip uye port nhamba, verenga rairo kubva kune yekupinda rwizi (munyaya iyi, iyo keyboard), iparadze, iendese kune server, uye, zvichienderana nekuti iwe inoda kutumira kana kugamuchira faira, kuiendesa kana kutora.

Iyo kodhi yekutangisa mutengi kuti abatanidze kune sevha uye kumirira murairo kubva kune yekupinda rwizi inotaridzika seizvi. Chiverengero chakasiyana chepasi rose chinoshandiswa pano chinotsanangurwa kunze kwechinyorwa, mune yakazara chinyorwa chechirongwa. Nekuda kwehudiki hwadzo, handidzitaure kuti ndisanyanyoremedza chinyorwa.

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

Ngatiendei pamusoro penzira dzinodanwa muiyi block yecode:

Pano iyo faira inotumirwa - tichishandisa scanner, tinopa zviri mukati mefaira semhando ye bytes, iyo yatinonyora imwe neimwe kune socket, mushure mezvo tinoivhara uye tinoizarura zvakare (kwete mhinduro yakajeka, asi. inovimbisa kuburitswa kwezviwanikwa), mushure mezvo isu tinoratidza meseji nezve kufambiswa kwakabudirira.

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

Ichi chikamu chekodhi chinotsanangura kutora data kubva kuseva. Zvese zvakare zvidiki, chete yekutanga block yekodhi ndiyo inofarira. Kuti unzwisise kuti ingani mabheti anoda kuverengerwa kubva pane socket, iwe unofanirwa kuziva kuti yakawanda sei iyo faira inotamiswa inorema. Saizi yefaira pasevha inomiririrwa senhamba refu, saka 4 bytes inogamuchirwa pano, iyo inozoshandurwa kuita nhamba imwe. Iyi haisi nzira yeJava, yakangofanana neSI, asi inogadzirisa dambudziko rayo.

Zvadaro zvinhu zvose zvidiki - tinogamuchira nhamba inozivikanwa yemabheti kubva pachigadziko uye tonyora kune faira, mushure mezvo tinoratidza meseji yekubudirira.

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

Kana murairo usiri kuwana kana kuisa wakapinda muhwindo remutengi, iyo showErrorMessage basa ichadaidzwa, zvichiratidza kuti iyo yekuisa yaive isiriyo. Nekuda kwekusakosha, ini handisi kuzvitaura. Chimwe chinonakidza ibasa rekugamuchira nekutsemura tambo yekupinza. Isu tinopfuudza scanner mairi, kubva kwatinotarisira kugashira mutsara wakaparadzaniswa nenzvimbo mbiri uye ine murairo, kunobva kero uye kero yekuenda.

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

Kutumira murairo-inotumira murairo wakapinda kubva ku scanner kusvika kune socket uye inomanikidza kuti itumirwe

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

Sarudzo ibasa rinotara zviito zvechirongwa zvichienderana netambo yakapinda. Zvese zviri pano hazvina kunaka kwazvo uye hunyengeri hunoshandiswa hausi hwakanakisa nekumanikidzwa kubuda kunze kwekodhi kodhi, asi chikonzero chikuru cheizvi kusavapo muJava yezvimwe zvinhu, senhume muC #, mabasa anonongedzera kubva kuC ++, kana pa. zvishoma iyo inotyisa uye inotyisa goto, iyo inokutendera iwe kuita izvi zvakanaka. Kana iwe uchiziva kuita kuti kodhi iwedzere kuyevedza, ndinogamuchira kushoropodzwa mumashoko. Zvinoita kwandiri sekuti duramazwi reString-delegate rinodiwa pano, asi hapana mumiriri...

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

TFTPSserver

Kushanda kwesevha kunosiyana nekushanda kwemutengi, kazhinji, chete mune izvo mirairo inouya kwairi kwete kubva kukhibhodi, asi kubva pane socket. Dzimwe nzira dzinowanzofanana, saka ini handisi kuzodzitaura, ini ndinongobata chete mutsauko.

Kutanga, iyo nzira yekumhanya inoshandiswa, iyo inogamuchira chiteshi seyekupinza uye inogadzirisa iyo data yekuisa kubva pachisokisi mune isingaperi loop.

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

Iyo yekuisa nzira, iyo inoputira nzira yekunyoraToFileFromSocket inovhura rwizi rwekunyora kune faira uye inonyora ese mabheti ekuisa kubva pachisokisi, inoratidza meseji inoratidza kubudirira kupedzwa kwekutamisa kana kunyora kwapera.

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

Iyo nzira yekuwana inotora iyo server faira. Sezvatotaurwa muchikamu chiri padivi remutengi wechirongwa, kuti ubudirire kuendesa faira unofanirwa kuziva saizi yaro, yakachengetwa muinhamba refu, saka ndinoipatsanura kuita 4 bytes, kuaendesa byte-by-byte. kune socket, uyezve, ndagamuchira uye nekuaunganidza pane mutengi munhamba kumashure, ndinoendesa ese mabheti anoumba faira, verenga kubva kune yekupinza rwizi kubva mufaira.


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

Iyo getAndParseInput nzira yakafanana neyemutengi, mutsauko chete ndewekuti inoverenga data kubva pane socket kwete kubva kukhibhodi. Iyo kodhi iri mune repository, senge selector.
Muchiitiko ichi, kutanga kunoiswa mune imwe nzvimbo yekodhi yekodhi, nokuti mukati mekuita uku, mushure mekutamisa kwapera, zviwanikwa zvinoburitswa uye kugarwa zvakare - zvakare kupa dziviriro kubva pakudonha kwendangariro.

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

Kupfupikisa:

Isu tangonyora zvedu mutsauko pane yakapfava yekufambisa data protocol uye takaona kuti inofanira kushanda sei. Muchidimbu, handina kuwana America pano uye handina kunyora zvinhu zvitsva zvakawanda, asi pakanga pasina zvinyorwa zvakafanana paHabrΓ©, uye sechikamu chekunyora nhevedzano yezvinyorwa nezve cmd zvishandiso zvaisaita kuti usabata pairi.

Mareferensi:

Source code repository
Muchidimbu nezve TFTP
Zvimwe chete, asi muchiRussia

Source: www.habr.com

Voeg