Kulemba mapulogalamu ndi magwiridwe antchito a Windows kasitomala-server, gawo 02

Kupitiliza mndandanda wazinthu zomwe zimaperekedwa pakukhazikitsa makonda a Windows console, sitingachitire mwina koma kukhudza TFTP (Trivial File Transfer Protocol) - protocol yosavuta yosamutsa mafayilo.

Monga nthawi yomaliza, tiyeni tidutse mwachidule chiphunzitsocho, tiwone code yomwe imagwiritsa ntchito magwiridwe antchito ofanana ndi omwe amafunikira, ndikusanthula. Zambiri - pansi pa odulidwa

Sindingakopere zidziwitso, maulalo omwe mwachizolowezi amapezeka kumapeto kwa nkhaniyo, ndingonena kuti pachimake, TFTP ndikusintha kosavuta kwa protocol ya FTP, momwe mawonekedwe owongolera olowera ali nawo. zachotsedwa, ndipo kwenikweni palibe chilichonse pano kupatulapo malamulo olandirira ndi kusamutsa fayilo . Komabe, kuti tipangitse kukhazikitsa kwathu kukhala kokongola kwambiri komanso kogwirizana ndi mfundo zamakono zolembera, mawuwa asinthidwa pang'ono - izi sizisintha mfundo zogwirira ntchito, koma mawonekedwe, IMHO, amakhala omveka komanso omveka bwino. amaphatikiza zabwino za FTP ndi TFTP.

Makamaka, ikakhazikitsidwa, kasitomala amapempha adilesi ya IP ya seva ndi doko lomwe mwambo wa TFTP umatsegulidwa (chifukwa chosagwirizana ndi protocol wamba, ndidawona kuti ndizoyenera kusiya wogwiritsa ntchito kusankha doko), pambuyo pake a kugwirizana kumachitika, chifukwa chomwe kasitomala amatha kutumiza limodzi la malamulo - kupeza kapena kuika, kulandira kapena kutumiza fayilo ku seva. Mafayilo onse amatumizidwa munjira ya binary kuti muchepetse malingaliro.

Kuti ndigwiritse ntchito protocol, ndimakonda kugwiritsa ntchito makalasi 4:

  • TFTPClient
  • TFTPSSeva
  • TFTPClientTester
  • TFTPServerTester

Chifukwa chakuti makalasi oyesera alipo kuti athetse vuto lalikulu, sindidzawasanthula, koma code idzakhala m'malo osungira; ulalo wake ukhoza kupezeka kumapeto kwa nkhaniyo. Tsopano ndiyang'ana makalasi akuluakulu.

TFTPClient

Ntchito ya kalasi iyi ndikulumikiza ku seva yakutali ndi ip ndi nambala ya doko, werengani lamulo kuchokera pamakina olowera (panthawiyi, kiyibodi), perekani, tumizani ku seva, ndipo, kutengera muyenera kutumiza kapena kulandira fayilo, kusamutsa kapena kutenga.

Khodi yoyambitsa kasitomala kuti alumikizane ndi seva ndikudikirira lamulo kuchokera pamtsinje wolowera akuwoneka chonchi. Zosintha zingapo zapadziko lonse lapansi zomwe zimagwiritsidwa ntchito pano zikufotokozedwa kunja kwa nkhaniyo, m'mawu onse a pulogalamuyi. Chifukwa cha kupepuka kwawo, sindimawatchula kuti ndisachulukitse nkhaniyo.

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

Tiyeni tidutse njira zomwe zimatchedwa mu block ya code iyi:

Apa fayilo imatumizidwa - pogwiritsa ntchito scanner, timapereka zomwe zili mufayilo ngati ma byte angapo, omwe timalemba imodzi ndi imodzi ku socket, kenako timatseka ndikutsegulanso (osati yankho lodziwika bwino, koma). imatsimikizira kutulutsidwa kwazinthu), pambuyo pake timawonetsa uthenga wokhudza kusamutsa bwino.

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

Chidutswa cha code ichi chikufotokoza kubweza deta kuchokera ku seva. Chilichonse chimakhalanso chaching'ono, kokha chipika choyamba cha code chomwe chili ndi chidwi. Kuti mumvetsetse kuchuluka kwa ma byte omwe akuyenera kuwerengedwa kuchokera pa socket, muyenera kudziwa kuchuluka kwa fayilo yomwe yasamutsidwa ikulemera. Kukula kwa fayilo pa seva kumayimiridwa ngati nambala yayitali, kotero ma byte 4 amavomerezedwa apa, omwe pambuyo pake amasinthidwa kukhala nambala imodzi. Iyi si njira ya Java kwambiri, ndiyofanana ndi SI, koma imathetsa vuto lake.

Ndiye zonse ndi zazing'ono - timalandira chiwerengero chodziwika cha ma byte kuchokera pazitsulo ndikuzilemba ku fayilo, pambuyo pake timawonetsa uthenga wopambana.

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

Ngati lamulo lina osati kupeza kapena kuyika lidalowetsedwa muwindo la kasitomala, ntchito ya showErrorMessage idzatchedwa, kusonyeza kuti zomwe zalowetsazo zinali zolakwika. Chifukwa cha kupusa, sindimatchula. Chochititsa chidwi kwambiri ndi ntchito yolandira ndi kugawa chingwe cholowetsa. Timadutsa scanner mmenemo, kumene tikuyembekeza kulandira mzere wolekanitsidwa ndi mipata iwiri ndikukhala ndi lamulo, adiresi yochokera ndi adilesi yopita.

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

Kutumiza lamulo-kutumiza lamulo lolowa kuchokera ku scanner kupita ku socket ndikukakamiza kuti litumizidwe

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

Chosankha ndi ntchito yomwe imasankha zochita za pulogalamuyo malinga ndi chingwe chomwe chalowetsedwa. Chilichonse pano sichili chokongola kwambiri ndipo chinyengo chomwe chimagwiritsidwa ntchito sichabwino kwambiri chotuluka kunja kwa code block, koma chifukwa chachikulu cha izi ndikusowa kwa Java pazinthu zina, monga nthumwi ku C #, zolozera ntchito kuchokera ku C ++, kapena pa. Goto yoyipa komanso yoyipa, yomwe imakulolani kuti mugwiritse ntchito izi mokongola. Ngati mukudziwa momwe mungapangire kachidindo kukhala kokongola kwambiri, ndimalandira kutsutsidwa mu ndemanga. Zikuwoneka kwa ine kuti dikishonale ya String-delegate ikufunika pano, koma palibe nthumwi...

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

TFTPSSeva

Magwiridwe a seva amasiyana ndi ntchito ya kasitomala, mokulira, pokhapokha kuti malamulo amabwera kwa iwo osati kuchokera ku kiyibodi, koma kuchokera ku socket. Njira zina nthawi zambiri zimakhala zofanana, kotero sindingatchule, ndingokhudza kusiyana kwake.

Poyambira, njira yothamangitsira imagwiritsidwa ntchito, yomwe imalandira doko ngati cholowetsa ndikusintha zolowa kuchokera ku socket mu loop yamuyaya.

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

Njira yoyika, yomwe imakulunga njira ya writeToFileFromSocket yomwe imatsegula mtsinje wolembera ku fayilo ndikulemba ma byte onse olowera kuchokera mu socket, imawonetsa uthenga wosonyeza kuti kusamutsa kwatha.

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

Njira yopezera imapeza fayilo ya seva. Monga tafotokozera kale m'gawo la kasitomala wa pulogalamuyo, kuti muthe kusamutsa fayilo, muyenera kudziwa kukula kwake, kusungidwa mumtundu wautali, kotero ndidawagawa m'magulu 4, kuwasamutsa. ku socket, ndiyeno, nditalandira ndikuwasonkhanitsa pa kasitomala mu nambala kumbuyo, ndimasamutsa ma byte onse omwe amapanga fayilo, ndikuwerenga kuchokera pamtsinje wolowera kuchokera pa fayilo.


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

Njira ya getAndParseInput ndi yofanana ndi ya kasitomala, kusiyana kokhako ndikuti imawerenga deta kuchokera pasoketi osati kuchokera pa kiyibodi. Khodi ili munkhokwe, monga chosankha.
Pankhaniyi, kukhazikitsidwa kumayikidwa mu code yosiyana, chifukwa mkati mwa kukhazikitsidwa uku, kusamutsidwa kukamalizidwa, zothandizira zimatulutsidwa ndikukhazikikanso - kachiwiri kuti ziteteze ku kutayikira kukumbukira.

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

Mwachidule:

Tangolemba kumene kusintha kwathu pa protocol yosavuta yosamutsa deta ndikuwona momwe iyenera kugwirira ntchito. M'malo mwake, sindinapeze America pano ndipo sindinalembe zinthu zatsopano, koma panalibe zolemba zofanana za HabrΓ©, ndipo monga gawo lolemba mndandanda wazinthu zokhudzana ndi cmd zinali zosatheka kuzikhudza.

Zolemba:

Source code repository
Mwachidule za TFTP
Zomwezo, koma mu Russian

Source: www.habr.com

Kuwonjezera ndemanga