ПисанС Π½Π° софтуСр с функционалността Π½Π° Windows ΠΊΠ»ΠΈΠ΅Π½Ρ‚-ΡΡŠΡ€Π²ΡŠΡ€ ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ, част 02

ΠŸΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠ°Π²Π°ΠΉΠΊΠΈ ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠ°Π²Π°Ρ‰Π°Ρ‚Π° ΠΏΠΎΡ€Π΅Π΄ΠΈΡ†Π° ΠΎΡ‚ статии, посвСтСни Π½Π° потрСбитСлски Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π½ΠΈ ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ Π½Π° Windows, Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π½Π΅ сС докоснСм Π΄ΠΎ TFTP (Trivial File Transfer Protocol) - прост ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Π·Π° ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»ΡΠ½Π΅ Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅.

ΠšΠ°ΠΊΡ‚ΠΎ миналия ΠΏΡŠΡ‚, Π½Π΅ΠΊΠ° ΠΏΡ€Π΅Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π½Π°ΠΊΡ€Π°Ρ‚ΠΊΠΎ тСорията, Π²ΠΈΠΆΡ‚Π΅ ΠΊΠΎΠ΄Π°, ΠΊΠΎΠΉΡ‚ΠΎ изпълнява функционалност, ΠΏΠΎΠ΄ΠΎΠ±Π½Π° Π½Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ°Ρ‚Π°, ΠΈ Π³ΠΎ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΉΡ‚Π΅. ΠŸΠΎΠ²Π΅Ρ‡Π΅ Π΄Π΅Ρ‚Π°ΠΉΠ»ΠΈ - ΠΏΠΎΠ΄ ΠΊΡ€ΠΎΠΉΠΊΠ°Ρ‚Π°

Няма Π΄Π° ΠΊΠΎΠΏΠΈΡ€Π°ΠΌ ΠΈ поставям Ρ€Π΅Ρ„Π΅Ρ€Π΅Π½Ρ‚Π½Π° информация, Π²Ρ€ΡŠΠ·ΠΊΠΈ към която Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Π½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΈ Π² края Π½Π° статията, Ρ‰Π΅ ΠΊΠ°ΠΆΠ° само, Ρ‡Π΅ Π² основата си TFTP Π΅ опростСн Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π½Π° FTP ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°, Π² ΠΊΠΎΠΉΡ‚ΠΎ настройката Π·Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ» Π½Π° Π΄ΠΎΡΡ‚ΡŠΠΏΠ° ΠΈΠΌΠ° Π΅ ΠΏΡ€Π΅ΠΌΠ°Ρ…Π½Π°Ρ‚ ΠΈ Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ Ρ‚ΡƒΠΊ няма Π½ΠΈΡ‰ΠΎ освСн ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Π·Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ ΠΈ ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»ΡΠ½Π΅ Π½Π° Ρ„Π°ΠΉΠ». Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‚ΠΎΠ²Π°, Π·Π° Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ Π½Π°ΡˆΠ°Ρ‚Π° рСализация ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-Π΅Π»Π΅Π³Π°Π½Ρ‚Π½Π° ΠΈ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€Π°Π½Π° към настоящитС ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈ Π½Π° писанС Π½Π° ΠΊΠΎΠ΄, ΡΠΈΠ½Ρ‚Π°ΠΊΡΠΈΡΡŠΡ‚ Π΅ Π»Π΅ΠΊΠΎ ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅Π½ - ​​това Π½Π΅ промСня ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΡ‚Π΅ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°, Π½ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡŠΡ‚, IMHO, става ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ ΠΈ ΡΡŠΡ‡Π΅Ρ‚Π°Π²Π° ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»Π½ΠΈΡ‚Π΅ аспСкти Π½Π° FTP ΠΈ TFTP.

По-спСциално, ΠΊΠΎΠ³Π°Ρ‚ΠΎ сС стартира, ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡŠΡ‚ изисква IP адрСса Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π° ΠΈ ΠΏΠΎΡ€Ρ‚Π°, Π½Π° ΠΊΠΎΠΉΡ‚ΠΎ Π΅ ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ пСрсонализираният TFTP (ΠΏΠΎΡ€Π°Π΄ΠΈ Π½Π΅ΡΡŠΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ със стандартния ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ», смСтнах Π·Π° подходящо Π΄Π° оставя Π½Π° потрСбитСля Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚Ρ‚Π° Π΄Π° ΠΈΠ·Π±ΠΈΡ€Π° ΠΏΠΎΡ€Ρ‚), слСд ΠΊΠΎΠ΅Ρ‚ΠΎ възниква Π²Ρ€ΡŠΠ·ΠΊΠ°, Π² Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡŠΡ‚ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·ΠΏΡ€Π°Ρ‚ΠΈ Π΅Π΄Π½Π° ΠΎΡ‚ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡ‚Π΅ - get ΠΈΠ»ΠΈ put, Π·Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ ΠΈΠ»ΠΈ ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Π½Π΅ Π½Π° Ρ„Π°ΠΉΠ» към ΡΡŠΡ€Π²ΡŠΡ€Π°. Всички Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ сС ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Ρ‚ Π² Π΄Π²ΠΎΠΈΡ‡Π΅Π½ Ρ€Π΅ΠΆΠΈΠΌ, Π·Π° Π΄Π° сС опрости Π»ΠΎΠ³ΠΈΠΊΠ°Ρ‚Π°.

Π—Π° Π΄Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°, Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ… 4 класа:

  • TFTPClient
  • TFTPSΡŠΡ€Π²ΡŠΡ€
  • 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 Π±Π°ΠΉΡ‚Π°, ΠΊΠΎΠΈΡ‚ΠΎ впослСдствиС сС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°Ρ‚ Π² Π΅Π΄Π½ΠΎ число. Π’ΠΎΠ²Π° Π½Π΅ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π½Π° Java, Ρ‚ΠΎΠΉ Π΅ доста ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π·Π° SI, Π½ΠΎ Ρ€Π΅ΡˆΠ°Π²Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΌΡƒ.

Π’ΠΎΠ³Π°Π²Π° всичко Π΅ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»Π½ΠΎ - ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ извСстСн Π±Ρ€ΠΎΠΉ Π±Π°ΠΉΡ‚ΠΎΠ²Π΅ ΠΎΡ‚ сокСта ΠΈ Π³ΠΈ записвамС във Ρ„Π°ΠΉΠ», слСд ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΏΠΎΠΊΠ°Π·Π²Π°ΠΌΠ΅ ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ Π·Π° успСх.

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

Π‘Π΅Π»Π΅ΠΊΡ‚ΠΎΡ€ΡŠΡ‚ Π΅ функция, която опрСдСля дСйствията Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° Π² зависимост ΠΎΡ‚ въвСдСния Π½ΠΈΠ·. Всичко Ρ‚ΡƒΠΊ Π½Π΅ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ красиво ΠΈ използваният Ρ‚Ρ€ΠΈΠΊ Π½Π΅ Π΅ Π½Π°ΠΉ-добрият с ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΈΠ·Π»ΠΈΠ·Π°Π½Π΅ извън кодовия Π±Π»ΠΎΠΊ, Π½ΠΎ основната ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Π·Π° Ρ‚ΠΎΠ²Π° Π΅ липсата Π² Java Π½Π° някои Π½Π΅Ρ‰Π°, ΠΊΠ°Ρ‚ΠΎ Π΄Π΅Π»Π΅Π³Π°Ρ‚ΠΈ Π² C#, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΡ‚ 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);
    }
}

TFTPSΡŠΡ€Π²ΡŠΡ€

Ѐункционалността Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π° сС Ρ€Π°Π·Π»ΠΈΡ‡Π°Π²Π° ΠΎΡ‚ функционалността Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΊΠ°Ρ‚ΠΎ цяло само ΠΏΠΎ Ρ‚ΠΎΠ²Π°, Ρ‡Π΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡ‚Π΅ ΠΈΠ΄Π²Π°Ρ‚ към Π½Π΅Π³ΠΎ Π½Π΅ ΠΎΡ‚ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π°Ρ‚Π°, Π° ΠΎΡ‚ сокСта. Някои ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΡ‚Π΅ ΠΊΠ°Ρ‚ΠΎ цяло са Π΅Π΄Π½Π°ΠΊΠ²ΠΈ, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ няма Π΄Π° Π³ΠΈ Ρ†ΠΈΡ‚ΠΈΡ€Π°ΠΌ, Π° само Ρ‰Π΅ засСгна Ρ€Π°Π·Π»ΠΈΠΊΠΈΡ‚Π΅.

Π—Π° Π½Π°Ρ‡Π°Π»ΠΎ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΡŠΡ‚ 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 Π΅ ΡΡŠΡ‰ΠΈΡΡ‚ ΠΊΠ°Ρ‚ΠΎ Π² ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, ΠΊΠ°Ρ‚ΠΎ СдинствСната Ρ€Π°Π·Π»ΠΈΠΊΠ° Π΅, Ρ‡Π΅ Ρ‡Π΅Ρ‚Π΅ Π΄Π°Π½Π½ΠΈ ΠΎΡ‚ сокСта, Π° Π½Π΅ ΠΎΡ‚ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π°Ρ‚Π°. ΠšΠΎΠ΄ΡŠΡ‚ Π΅ Π² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ, Ρ‚ΠΎΡ‡Π½ΠΎ ΠΊΠ°Ρ‚ΠΎ сСлСктор.
Π’ Ρ‚ΠΎΠ·ΠΈ случай инициализацията сС поставя Π² ΠΎΡ‚Π΄Π΅Π»Π΅Π½ Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄, Ρ‚.ΠΊ Π² Ρ€Π°ΠΌΠΊΠΈΡ‚Π΅ Π½Π° Ρ‚Π°Π·ΠΈ рСализация, слСд ΠΊΠ°Ρ‚ΠΎ ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»ΡΠ½Π΅Ρ‚ΠΎ ΠΏΡ€ΠΈΠΊΠ»ΡŽΡ‡ΠΈ, рСсурситС сС освобоТдават ΠΈ Π·Π°Π΅ΠΌΠ°Ρ‚ ΠΎΡ‚Π½ΠΎΠ²ΠΎ - ΠΎΡ‚Π½ΠΎΠ²ΠΎ, Π·Π° Π΄Π° сС осигури Π·Π°Ρ‰ΠΈΡ‚Π° срСщу ΠΈΠ·Ρ‚ΠΈΡ‡Π°Π½Π΅ Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚.

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

Π”Π° ΠΎΠ±ΠΎΠ±Ρ‰ΠΈΠΌ:

Π’ΠΎΠΊΡƒ-Ρ‰ΠΎ написахмС нашия собствСн Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π½Π° прост ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Π·Π° прСнос Π½Π° Π΄Π°Π½Π½ΠΈ ΠΈ Ρ€Π°Π·Π±Ρ€Π°Ρ…ΠΌΠ΅ ΠΊΠ°ΠΊ трябва Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ. По ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π½Π΅ ΠΎΡ‚ΠΊΡ€ΠΈΡ… АмСрика Ρ‚ΡƒΠΊ ΠΈ Π½Π΅ написах ΠΌΠ½ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΈ Π½Π΅Ρ‰Π°, Π½ΠΎ нямашС ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ статии Π½Π° HabrΓ© ΠΈ ​​като част ΠΎΡ‚ писанСто Π½Π° ΠΏΠΎΡ€Π΅Π΄ΠΈΡ†Π° ΠΎΡ‚ статии Π·Π° cmd ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ бСшС нСвъзмоТно Π΄Π° Π½Π΅ сС докосна Π΄ΠΎ Π½Π΅Π³ΠΎ.

Π·Π° справка:

Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Π½Π° изходния ΠΊΠΎΠ΄
Накратко Π·Π° TFTP
Π‘ΡŠΡ‰ΠΎΡ‚ΠΎ Π½Π΅Ρ‰ΠΎ, Π½ΠΎ Π½Π° руски

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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€