Ke kākau ʻana i nā lako polokalamu me ka hana o nā mea hoʻohana ʻo Windows client-server, ʻāpana 02

Ke hoʻomau nei i ka hoʻomau ʻana o nā ʻatikala i hoʻolaʻa ʻia i ka hoʻokō maʻamau o nā hāmeʻa console Windows, ʻaʻole hiki iā mākou ke hoʻopā i ka TFTP (Trivial File Transfer Protocol) - kahi protocol transfer file maʻalahi.

E like me ka manawa hope loa, e hele pōkole kākou ma luna o ke kumumanaʻo, e ʻike i ke code e hoʻokō ana i nā hana like me ka mea i koi ʻia, a hoʻopaʻa ʻia. Nā kikoʻī hou aku - ma lalo o ka ʻoki

ʻAʻole au e kope kope i ka ʻike kuhikuhi, nā loulou i hiki ke ʻike maʻamau ma ka hope o ka ʻatikala, e ʻōlelo wale wau ma kāna kumu, ʻo TFTP kahi hoʻololi maʻalahi o ka protocol FTP, kahi i loaʻa ai ka hoʻonohonoho mana hoʻonohonoho. ua wehe ʻia, a ʻoiaʻiʻo, ʻaʻohe mea ma aneʻi koe wale nō nā kauoha no ka loaʻa ʻana a me ka hoʻoili ʻana i kahi faila . Eia naʻe, i mea e hoʻonui iki ai i kā mākou hoʻokō ʻana a hoʻololi ʻia i nā loina o kēia manawa o ke kākau ʻana i nā code, ua hoʻololi iki ʻia ka syntax - ʻaʻole kēia e hoʻololi i nā loina o ka hana, akā ʻo ka interface, IMHO, e lilo i mea kūpono a hoʻohui i nā mea maikaʻi o FTP a me TFTP.

ʻO ka mea nui, i ka wā i hoʻokuʻu ʻia, noi ka mea kūʻai aku i ka IP address o ka server a me ke awa kahi i wehe ʻia ai ka TFTP maʻamau (ma muli o ke kūlike ʻole me ka protocol maʻamau, manaʻo wau he kūpono ia e waiho i ka mea hoʻohana i ka hiki ke koho i kahi awa), a laila a hiki mai ka pilina, ma muli o ka hiki i ka mea kūʻai ke hoʻouna i kekahi o nā kauoha - e kiʻi a waiho paha, e loaʻa a hoʻouna paha i kahi faila i ke kikowaena. Hoʻouna ʻia nā faila a pau ma ke ʻano binary e hoʻomaʻamaʻa i ka loiloi.

No ka hoʻokō ʻana i ka protocol, ua hoʻohana au i nā papa 4:

  • TFTPClient
  • TFTPServer
  • TFTPClientTester
  • TFTPServerTester

Ma muli o ka loaʻa ʻana o nā papa hoʻāʻo no ka hoʻopau ʻana i nā mea nui, ʻaʻole wau e loiloi iā lākou, akā aia ke code i loko o ka waihona; hiki ke loaʻa kahi loulou i ka hopena o ka ʻatikala. I kēia manawa e nānā au i nā papa nui.

TFTPClient

ʻO ka hana o kēia papa e hoʻopili i kahi kikowaena mamao ma kāna ip a me ka helu port, heluhelu i kahi kauoha mai ke kahawai hoʻokomo (ma kēia hihia, ʻo ka papa keyboard), e hoʻololi iā ia, e hoʻololi iā ia i ke kikowaena, a, e hilinaʻi ana inā ʻoe. pono e hoʻouna a loaʻa paha i kahi faila, hoʻoili a loaʻa paha.

ʻO ke code no ka hoʻokuʻu ʻana i ka mea kūʻai aku e hoʻopili i ke kikowaena a kali i kahi kauoha mai ke kahawai hoʻokomo e like me kēia. Ua wehewehe ʻia kekahi mau ʻano hoʻololi honua i hoʻohana ʻia ma waho o ka ʻatikala, i ka kikokikona piha o ka papahana. Ma muli o ko lākou mea liʻiliʻi, ʻaʻole wau e haʻi iā lākou i ʻole e hoʻonui i ka ʻatikala.

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

E hele kāua i nā ʻano i kapa ʻia ma kēia poloka code:

Hoʻouna ʻia ka faila - me ka hoʻohana ʻana i kahi scanner, hōʻike mākou i nā ʻike o ka faila ma ke ʻano he nui o nā bytes, a mākou e kākau ai i kēlā me kēia i ke kumu, a laila pani mākou a wehe hou (ʻaʻole ka hopena maopopo loa, akā. hōʻoiaʻiʻo ia i ka hoʻokuʻu ʻana i nā kumuwaiwai), a laila hōʻike mākou i kahi leka e pili ana i ka hoʻoili kūleʻa.

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

Hōʻike kēia ʻāpana code i ka lawe ʻana i ka ʻikepili mai ke kikowaena. He mea liʻiliʻi hou nā mea a pau, ʻo ka poloka mua wale nō o ke code. I mea e maopopo pono ai i ka nui o nā bytes e pono ke heluhelu ʻia mai ke kumu, pono ʻoe e ʻike i ka nui o ke kaumaha o ka faila i hoʻoili ʻia. Hōʻike ʻia ka nui o ka faila ma ke kikowaena ma ke ʻano he integer lōʻihi, no laila ua ʻae ʻia ʻo 4 bytes ma ʻaneʻi, a laila hoʻololi ʻia i hoʻokahi helu. ʻAʻole kēia he ala Java loa, ua like ia me ka SI, akā hoʻoponopono ia i kona pilikia.

A laila he mea liʻiliʻi nā mea āpau - loaʻa iā mākou kahi helu o nā bytes i ʻike ʻia mai ke kumu a kākau iā lākou i kahi faila, a laila hōʻike mākou i kahi leka kūleʻa.

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

Inā hoʻokomo ʻia kahi kauoha ʻē aʻe ma mua o ka loaʻa a hoʻokomo ʻia i loko o ka pukaaniani o ka mea kūʻai aku, e kāhea ʻia ka hana showErrorMessage, e hōʻike ana ua hewa ka hoʻokomo. Ma muli o ka liʻiliʻi, ʻaʻole wau e haʻi. ʻOi aku ka hoihoi i ka hana o ka loaʻa ʻana a me ka hoʻokaʻawale ʻana i ke kaula hoʻokomo. Hoʻokomo mākou i ka scanner i loko, kahi a mākou e manaʻo ai e loaʻa kahi laina i hoʻokaʻawale ʻia e ʻelua mau hakahaka a loaʻa ke kauoha, ka helu kumu a me ka helu wahi.

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

Ka hoʻouna ʻana i kahi kauoha—e hoʻouna i ke kauoha i hoʻokomo ʻia mai ka scanner i ke kumu a koi ʻia e hoʻouna ʻia

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

ʻO kahi mea koho he hana e hoʻoholo ai i nā hana o ka papahana ma muli o ke kaula i hoʻokomo ʻia. ʻAʻole nani loa nā mea a pau a ʻo ka hoʻopunipuni i hoʻohana ʻia ʻaʻole ia ka mea maikaʻi loa me ka puka ʻana ma waho o ka poloka code, akā ʻo ke kumu nui o kēia ka nele i Java o kekahi mau mea, e like me nā ʻelele ma C #, nā kuhikuhi hana mai C++, a i ʻole. ka liʻiliʻi o ka goto weliweli a me ka weliweli, e ʻae iā ʻoe e hoʻokō i kēia nani. Inā ʻike ʻoe pehea e hoʻonui iki ai i ke code, mahalo wau i ka hoʻohewa ʻana ma nā ʻōlelo. Me he mea lā iaʻu e pono ai kahi puke wehewehe ʻōlelo String-delegate ma ʻaneʻi, akā ʻaʻohe ʻelele...

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

TFTPServer

ʻOkoʻa ka hana o ka kikowaena mai ka hana o ka mea kūʻai aku, ma ka nui, aia wale nō nā kauoha i hele mai iā ia ʻaʻole mai ka papa keyboard, akā mai ke kumu. ʻO kekahi o nā ʻano hana like ʻole, no laila ʻaʻole wau e haʻi iā lākou, e hoʻopā wale wau i nā ʻokoʻa.

No ka hoʻomaka ʻana, hoʻohana ʻia ke ʻano holo, kahi e loaʻa ai kahi awa ma ke ʻano he hoʻokomo a hana i ka ʻikepili hoʻokomo mai ke kumu i loko o kahi loop mau loa.

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

ʻO ke ala hoʻokomo, e hoʻopili ana i ke ʻano writeToFileFromSocket e wehe i kahi kahawai kākau i kahi faila a kākau i nā byte komo a pau mai ke kumu, e hōʻike ana i kahi memo e hōʻike ana i ka hoʻokō kūleʻa o ka hoʻoili ʻana ke pau ke kākau ʻana.

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

Hoʻihoʻi ke ala kiʻi i ka faila kikowaena. E like me ka mea i ʻōlelo ʻia ma ka ʻāpana ma ka ʻaoʻao o ka mea kūʻai aku o ka papahana, no ka hoʻoili kūleʻa ʻana i kahi faila pono ʻoe e ʻike i kona nui, mālama ʻia i loko o kahi integer lōʻihi, no laila ua hoʻokaʻawale wau iā ia i kahi ʻano o 4 bytes, e hoʻololi iā lākou byte-by-byte i ke kumu, a laila, i ka loaʻa ʻana a hōʻuluʻulu iā lākou ma ka mea kūʻai aku i kahi helu hoʻi, hoʻololi wau i nā bytes a pau i hana i ka faila, heluhelu mai ke kahawai komo mai ka faila.


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

Ua like ke ala getAndParseInput me ka mea kūʻai aku, ʻo ka ʻokoʻa wale nō ka heluhelu ʻana i ka ʻikepili mai ke kumu ma mua o ka papa keyboard. Aia ke code i loko o ka waihona, e like me ka mea koho.
I kēia hihia, hoʻokomo ʻia ka hoʻomaka ʻana i kahi poloka o ke code, no ka mea i loko o kēia hoʻokō ʻana, ma hope o ka pau ʻana o ka hoʻoili ʻana, hoʻokuʻu ʻia nā kumuwaiwai a hoʻopaʻa hou ʻia - e hāʻawi hou i ka pale mai nā leaka hoʻomanaʻo.

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

E hōʻuluʻulu:

Ua kākau wale mākou i kā mākou hoʻololi ʻana i kahi protocol transfer data maʻalahi a noʻonoʻo pehea e hana ai. Ma ke kumu, ʻaʻole au i ʻike iā ʻAmelika ma aneʻi a ʻaʻole i kākau nui i nā mea hou, akā ʻaʻohe ʻatikala like ʻole ma Habré, a ma ke ʻano he ʻāpana o ka kākau ʻana i nā ʻatikala e pili ana i ka cmd utilities hiki ʻole ke hoʻopā aku iā ia.

Nā Manaʻo:

Waihona kumu waihona
ʻO ka pōkole e pili ana iā TFTP
ʻO ka mea like, akā ma ka Lūkini

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka