НаписаниС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΠΎΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСрных ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ Windows, part 02

ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ Π½Π°Ρ‡Π°Ρ‚Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» статСй, посвящСнный кастомным рСализациям ΠΊΠΎΠ½ΡΠΎΠ»ΡŒΠ½Ρ‹Ρ… ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ Windows нСльзя Π½Π΅ Π·Π°Ρ‚Ρ€ΠΎΠ½ΡƒΡ‚ΡŒ TFTP (Trivial File Transfer Protocol) β€” простой ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ².

Как ΠΈ Π² ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΉ Ρ€Π°Π·, ΠΊΡ€Π°Ρ‚ΠΊΠΎ пробСТимся ΠΏΠΎ Ρ‚Π΅ΠΎΡ€ΠΈΠΈ, ΡƒΠ²ΠΈΠ΄ΠΈΠΌ ΠΊΠΎΠ΄, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π», Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΉ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠΌΡƒ, ΠΈ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ Π΅Π³ΠΎ. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ β€” ΠΏΠΎΠ΄ ΠΊΠ°Ρ‚ΠΎΠΌ

НС Π±ΡƒΠ΄Ρƒ ΠΊΠΎΠΏΠΈΠΏΠ°ΡΡ‚ΠΈΡ‚ΡŒ ΡΠΏΡ€Π°Π²ΠΎΡ‡Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, ссылки Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² ΠΊΠΎΠ½Ρ†Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ, скаТу лишь, Ρ‡Ρ‚ΠΎ ΠΏΠΎ своСй сути TFTP β€” упрощСнная вариация ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° FTP, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡƒΠ±Ρ€Π°Π½Π° настройка контроля доступа, Π΄Π° ΠΈ ΠΏΠΎ сути Ρ‚ΡƒΡ‚ Π½Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΊΡ€ΠΎΠΌΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ получСния ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Ρ„Π°ΠΉΠ»Π°. Однако, Π΄Π°Π±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½Π°ΡˆΡƒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Ρ‡ΡƒΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ изящной ΠΈ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΊ Π½Ρ‹Π½Π΅ΡˆΠ½ΠΈΠΌ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°ΠΌ написания ΠΊΠΎΠ΄Π°, синтаксис Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ β€” ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Ρ‹ это Π½Π΅ измСняСт, Π½ΠΎ интСрфСйс, ИМΠ₯О, становится Ρ‡ΡƒΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ ΠΈ сочСтаСт Π² сСбС ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ стороны FTP ΠΈ TFTP.

Π’ частности, ΠΏΡ€ΠΈ запускС ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ ip адрСс сСрвСра ΠΈ ΠΏΠΎΡ€Ρ‚, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ кастомный TFTP (Π² силу нСсовмСстимости с стандартным ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠΌ я счСл умСстным ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€Π° ΠΏΠΎΡ€Ρ‚Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ), послС Ρ‡Π΅Π³ΠΎ происходит соСдинСниС, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄ β€” get ΠΈΠ»ΠΈ put, для получСния ΠΈΠ»ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ Ρ„Π°ΠΉΠ»Π° Π½Π° сСрвСр. ВсС Ρ„Π°ΠΉΠ»Ρ‹ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ β€” Π² цСлях упрощСния Π»ΠΎΠ³ΠΈΠΊΠΈ.

Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΠΎΠ»Π° мною Π±Ρ‹Π»ΠΎ использовано Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ 4 класса:

  • TFTPClient
  • TFTPServer
  • TFTPClientTester
  • TFTPServerTester

Π’ силу Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ классы ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ основных, Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒ я ΠΈΡ… Π½Π΅ Π±ΡƒΠ΄Ρƒ, Π½ΠΎ ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ, с ссылкой Π½Π° Π½Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ Π² ΠΊΠΎΠ½Ρ†Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ. А основныС классы сСйчас Ρ€Π°Π·Π±Π΅Ρ€Ρƒ.

TFTPClient

Π—Π°Π΄Π°Ρ‡Π° этого класса β€” ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΊ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΌΡƒ сСрвСру ΠΏΠΎ Π΅Π³ΠΎ ip ΠΈ Π½ΠΎΠΌΠ΅Ρ€Ρƒ ΠΏΠΎΡ€Ρ‚Π°, ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ с Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС β€” ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹) ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, Ρ€Π°ΡΠΏΠ°Ρ€ΡΠΈΡ‚ΡŒ Π΅Π΅, ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ сСрвСру, ΠΈ, Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, трСбуСтся ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π°, ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ.

Код запуска ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π½Π° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ сСрвСру ΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ с ΠΏΠΎΡ‚ΠΎΠΊΠ° Π²Π²ΠΎΠ΄Π° выглядит Ρ‚Π°ΠΊ. Ряд Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ ΡΡ‚Π°Ρ‚ΡŒΠΈ, Π² ΠΏΠΎΠ»Π½ΠΎΠΌ тСкстС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’ силу ΠΈΡ… Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ я Π½Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠΆΡƒ, Π΄Π°Π±Ρ‹ Π½Π΅ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ ΡΡ‚Π°Ρ‚ΡŒΡŽ.

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

ΠŸΡ€ΠΎΠ±Π΅ΠΆΠΈΠΌΡΡ ΠΏΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ, Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΌ Π² Π΄Π°Π½Π½ΠΎΠΌ Π±Π»ΠΎΠΊΠ΅ ΠΊΠΎΠ΄Π°:

Π’ΡƒΡ‚ происходит ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° Ρ„Π°ΠΉΠ»Π° β€” с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сканСра ΠΌΡ‹ прСдставляСм содСрТимоС Ρ„Π°ΠΉΠ»Π° ΠΊΠ°ΠΊ массив Π±Π°ΠΉΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎ пишСм Π² сокСт, послС Ρ‡Π΅Π³ΠΎ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Π΅Π³ΠΎ ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Π·Π°Π½ΠΎΠ²ΠΎ (Π½Π΅ самоС ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, Π½ΠΎ ΠΎΠ½ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ освобоТдСниС рСсурсов), послС Ρ‡Π΅Π³ΠΎ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Π½Π° экран сообщСниС ΠΎΠ± ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅.

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

Π”Π°Π½Π½Ρ‹ΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π° описываСт ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… с сСрвСра. ВсС ΠΎΠΏΡΡ‚ΡŒ-Ρ‚Π°ΠΊΠΈ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΠΎ, интСрСс прСдставляСт лишь ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π°. Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, сколько ΠΈΠΌΠ΅Π½Π½ΠΎ Π±Π°ΠΉΡ‚ Π½ΡƒΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ с сокСта, Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ, сколько вСсит ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹ΠΉ Ρ„Π°ΠΉΠ». Π Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π° Π½Π° сСрвСрС прСдставляСтся Π΄Π»ΠΈΠ½Π½Ρ‹ΠΌ Ρ†Π΅Π»Ρ‹ΠΌ числом, поэтому Ρ‚ΡƒΡ‚ принимаСтся 4 Π±Π°ΠΉΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² послСдствии ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² ΠΎΠ΄Π½ΠΎ число. Π­Ρ‚ΠΎ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ Π”ΠΆΠ°Π²Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, Ρ‚Π°ΠΊΠΎΠ΅ скорСС ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ для БИ, Π½ΠΎ свою Π·Π°Π΄Π°Ρ‡Ρƒ ΠΎΠ½ΠΎ Ρ€Π΅ΡˆΠ°Π΅Ρ‚.

Π”Π°Π»ΡŒΡˆΠ΅ всС Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΠΎ β€” ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ извСстноС число Π±Π°ΠΉΡ‚ΠΎΠ² с сокСта ΠΈ записываСм ΠΈΡ… Π² Ρ„Π°ΠΉΠ», послС Ρ‡Π΅Π³ΠΎ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ сообщСниС ΠΎΠ± успСхС.

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

Π’ случаС, Ссли Π² ΠΎΠΊΠ½ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π±Ρ‹Π»Π° Π²Π²Π΅Π΄Π΅Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°, отличная ΠΎΡ‚ get ΠΈΠ»ΠΈ put, Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½Π° функция showErrorMessage, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π°Ρ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ ΠΈΠ½ΠΏΡƒΡ‚Π°. Π’ силу Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ β€” Π½Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠΆΡƒ. НСсколько интСрСснСС функция получния ΠΈ разбиСния Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ строки. Π’ Π½Π΅Π΅ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ сканСр, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ строку, Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ двумя ΠΏΡ€ΠΎΠ±Π΅Π»Π°ΠΌΠΈ ΠΈ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ Π² сСбС ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, адрСс источник ΠΈ адрСс назначСния.

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

ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ β€” ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠΉ с сканСра ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π² сокСт ΠΈ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° Π΅Π΅

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

Π‘Π΅Π»Π΅ΠΊΡ‚ΠΎΡ€ β€” функция, которая опрСдСляСт дСйствия ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² зависимости ΠΎΡ‚ Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠΉ строки. Π’ΡƒΡ‚ всС Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ красиво ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½Π΅ самый Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ ΠΏΡ€ΠΈΠ΅ΠΌ с ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π²Ρ‹Ρ…ΠΎΠ΄ΠΎΠΌ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ Π±Π»ΠΎΠΊΠ° ΠΊΠΎΠ΄Π°, Π½ΠΎ основной ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ этого являСтся отсутствиС Π² Π”ΠΆΠ°Π²Π΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Π΅Ρ‰Π΅ΠΉ, ΠΊΠ°ΠΊ Π΄Π΅Π»Π΅Π³Π°Ρ‚Ρ‹ Π² Π‘#, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ· C++ ΠΈΠ»ΠΈ хотя Π±Ρ‹ ΡΡ‚Ρ€Π°ΡˆΠ½Ρ‹ΠΉ ΠΈ уТасный goto, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ это красиво. Если Π·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ Ρ‡ΡƒΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ изящным β€” ΠΆΠ΄Ρƒ ΠΊΡ€ΠΈΡ‚ΠΈΠΊΡƒ Π² коммСнтариях. МнС каТСтся, Ρ‡Ρ‚ΠΎ Ρ‚ΡƒΡ‚ Π½ΡƒΠΆΠ΅Π½ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ String-delegate, Π½ΠΎ Π΄Π΅Π»Π΅Π³Π°Ρ‚Π° нСту…

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

TFTPServer

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» сСрвСра отличаСтся ΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΏΠΎ Π±ΠΎΠ»ΡŒΡˆΠΎΠΌΡƒ счСту лишь Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π½Π° Π½Π΅Π³ΠΎ приходят Π½Π΅ с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹, Π° ΠΈΠ· сокСта. Π§Π°ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² вообшС совпадаСт, поэтому ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈΡ… я Π½Π΅ Π±ΡƒΠ΄Ρƒ, Π·Π°Ρ‚Ρ€ΠΎΠ½Ρƒ лишь различия.

Для запуска Ρ‚ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ run, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠΉ Π½Π° Π²Ρ…ΠΎΠ΄ ΠΏΠΎΡ€Ρ‚ ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ с сокСта Π² Π²Π΅Ρ‡Π½ΠΎΠΌ Ρ†ΠΈΠΊΠ»Π΅.

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

ΠœΠ΅Ρ‚ΠΎΠ΄ put, ΡΠ²Π»ΡΡŽΡ‰ΠΈΠΉΡΡ ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° writeToFileFromSocket, ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ записи Π² Ρ„Π°ΠΉΠ» ΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ всС Π±Π°ΠΉΡ‚Ρ‹ Π²Π²ΠΎΠ΄Π° с сокСта, послС завСрщСния записи Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ сообщСниС ΠΎΠ± ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ.

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

ΠœΠ΅Ρ‚ΠΎΠ΄ get обСспСчиваСт ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° сСрвСра. Как ΡƒΠΆΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΎ клиСнтской сторонС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, для ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Ρ„Π°ΠΉΠ»Π° Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ Π΅Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€, хранящийся Π² Π΄Π»ΠΈΠ½Π½ΠΎΠΌ Ρ†Π΅Π»ΠΎΠΌ, поэтому я ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽ Π΅Π³ΠΎ Ρ€Π°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ Π½Π° массив ΠΈΠ· 4 Π±Π°ΠΉΡ‚, ΠΏΠΎΠ±Π°ΠΉΡ‚ΠΎΠ²ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽ ΠΈΡ… Π² сокСт, Π° ΠΏΠΎΡ‚ΠΎΠΌ, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ² ΠΈ собрав ΠΈΡ… Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅ Π² число ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ, ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽ всС Π±Π°ΠΉΡ‚Ρ‹, ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ Ρ„Π°ΠΉΠ», считанныС ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ° Π²Π²ΠΎΠ΄Π° ΠΈΠ· Ρ„Π°ΠΉΠ»Π°.


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

ΠœΠ΅Ρ‚ΠΎΠ΄ getAndParseInput совпадаСт с Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ Π² ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅, с Ρ‚ΠΎΠΉ лишь Ρ€Π°Π·Π½ΠΈΡ†Π΅ΠΉ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ считываСт Π΄Π°Π½Π½Ρ‹Π΅ с сокСта, Π° Π½Π΅ с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹. Код Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ, ΠΊΠ°ΠΊ ΠΈ selector.
Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС инициализация вынСсСна Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π°, Ρ‚.ΠΊ. Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Π΄Π°Π½Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ послС окончания ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ рСсурсы ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡŽΡ‚ΡΡ ΠΈ снова Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ Π·Π°Π½ΠΎΠ²ΠΎ β€” ΠΎΠΏΡΡ‚ΡŒ-Ρ‚Π°ΠΊΠΈ с Ρ†Π΅Π»ΡŒΡŽ обСспСчСния Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΎΡ‚ ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ памяти.

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

Π Π΅Π·ΡŽΠΌΠΈΡ€ΡƒΡ:

Волько Ρ‡Ρ‚ΠΎ ΠΌΡ‹ написали свою Π²Π°Ρ€ΠΈΠ°Ρ†ΠΈΡŽ Π½Π° Ρ‚Π΅ΠΌΡƒ простого ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ Π² Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. Π’ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅, АмСрики я Ρ‚ΡƒΡ‚ Π½Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Π» ΠΈ сильно Π½ΠΎΠ²ΠΎΠ³ΠΎ Π½Π΅ написал, Π½ΠΎ β€” Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Ρ… статСй Π½Π° Π₯Π°Π±Ρ€Π΅ Π½Π΅ Π±Ρ‹Π»ΠΎ, Π° Π² Ρ€Π°ΠΌΠΊΠ°Ρ… написания Ρ†ΠΈΠΊΠ»Π° статСй ΠΎ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π°Ρ… cmd нСльзя Π±Ρ‹Π»ΠΎ Π΅Π³ΠΎ Π½Π΅ Π·Π°Ρ‚Ρ€ΠΎΠ½ΡƒΡ‚ΡŒ.

Бсылки:

Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ с исходным ΠΊΠΎΠ΄ΠΎΠΌ
ΠšΡ€Π°Ρ‚ΠΊΠΎ ΠΎ TFTP
Π’ΠΎΠΆΠ΅ самоС, Π½ΠΎ Π½Π° русском

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ