Stworzenie serwera TFTP w NetBeans

0

Witam,

Mam napisac tftp w javie, uzywajac NB. Transfer danych client/server + min. 3 errors. Jako, ze jestem kompletnym lajkonikiem - zaczalem od czytania java.docs i innych materialow, zeby w ogole wprowadzic w zagmatwany swiat javy.
Posiadlem nieco wiedzy teoretycznej, ale mam problem z wprowadzeniem tego w praktyke. Nie bardzo wiem, od czego zaczac, czy od socketow, czy tworzac klasy RRQ/WRQ czy ERR?
Czy moglby mi ktos lopatologicznie dac wskazowke, od czego zaczac? Jak zaczne to podejrzewam pojdzie duzo latwiej, ale nie moge nigdzie znalezc zadnego tutka, ktory by wyjasnil chocby lakonicznie od czego zaczac, a na czym skonczyc. Nie mowie o kodzie - chocby krok po kroku, co robic.

To poniekad sprawa zycia lub smierci, wiec prosilbym o pomoc.

pzdr

0

Najpierw jakiś prosty klient-serwer, osiągnij komunikację, potem spróbuj przesłać pliki, potem obsłuż błędy. Przynajmniej ja bym tak robił.

0

Jak wspomnialem - jestem lajkonikiem, wiec pozwole sobie rozbic to na detale:

  • client><server
  • UDP sockets
  • data
  • errors
    Cos w ten desen? Czy jeszcze cos po dordze jest potrzebne?
0

Masakra :( Nigdzie nie ma wskazowek, jak to zrobic. Utknalem na amen
Czy ktos zna jakis tutorial dla tftp?! Przeszukalem potworna ilosc stron, YT i szlag wie czego jeszcze, ale jedyne co znalazlem, to gotowe kody,a nie tutek, jak je napisac :/
Nie mam pojecia, co robic po czym; jak transferowac dane miedzy klientem, a serverem. NIgdzie nie ma jednego logicznego wytlumaczenia procesow i kodu. Psiakrew :/
Zaczynaja mi ze stresu wlosy wypadac, a nie posunalem sie nawet o krok.

0

No wiec mam napisany kod. Troche kodu raczej. Zrobilem Write, ale nie wiem, jak zrobic Read i Err.
Moglby mi ktos pomoc nieco?

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package tftpp;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/**
 *
 * @author Komp
 */
public class TftpP {
// Constants
    private final static int SERVER_PORT = 69; // Default TFTP Server Port
    private final static int MAX_PACKET_SIZE = 516; // Biggest packet is DATA packet 4(header) + 512 data)
    private static String mode = null;
    private static String filename = null;
    static final String tftp = "C:\\tftp";
     static int errorCode = 0; 

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws FileNotFoundException {
        // TODO code application logic here
        try {
            DatagramSocket serverSocket = new DatagramSocket(SERVER_PORT);
            System.out.println("Listening In A Little While...");
            while (true) {

                // Accept Communication From Client
                byte[] bufferIn = new byte[MAX_PACKET_SIZE];
                DatagramPacket packetIn = new DatagramPacket(bufferIn, bufferIn.length);

                // Try To Receive The packet
                try {
                    serverSocket.receive(packetIn);
                } catch (IOException ex) {
                    // Print IO Exception Error
                    System.err.println(ex);
                }

                InetAddress ipIn = packetIn.getAddress();
                int portIn = packetIn.getPort();

                bufferIn = packetIn.getData();

                int packetEnd = packetIn.getLength();
                int packetStart = packetEnd - 12;

                String packetData = new String(packetIn.getData());
                String endOfPacket = packetData.substring(packetStart, packetEnd);

                int packetLength = packetIn.getLength();

                if (endOfPacket.indexOf("netascii") > 0) {
                    mode = "netascii";

                } else if (endOfPacket.indexOf("octet") > 0) {
                    mode = "octet";

                } else if (endOfPacket.indexOf("mail") > 0) {
                    mode = "mail";

                } else {
                    mode = "undefined";
                }

                if (mode.equals("octet")) {
                    packetLength -= 9;
                } else if (mode.equals("netascii")) {
                    packetLength -= 12;
                } else if (mode.equals("mail")) {
                    packetLength -= 8;
                }

                filename = new String(packetIn.getData(), 2, packetLength);

                switch (bufferIn[1]) {
                    case (byte) 1:
                        
                      System.out.println("The Transfer Will be from" + InetAddress + "on port" + portIn);
                        System.out.println("Read Request Received for File" + filename);
                        File readFile = new File(tftp + filename);
                        FileInputStream fileRead = new FileInputStream(readFile);
                        long length = readFile.length();
                        if (length > 0) {
                            
                            System.out.println("Filesize is" + length + "to small");
                            errorCode = 4;
                            break;
                        } else;
                         {
                        }
 
                    break;                       
                     
                    case (byte) 2:
                        // WRQ Packet

                        // Handle the WRQ
                        break;
                    case (byte) 3:
                        // DATA Packet
                        break;
                    case (byte) 4:
                        // ACK Packet
                        break;
                    case 5:
                        // ERROR Packet
                        break;
                    default:
                        // do code here
                        break;
                }
            }

        } catch (SocketException sex) {

            System.err.println(sex);
        }
    }
}

Pzdr

zamiana znacznika <quote> na <code class="java"> - furious programming

0

Sorry. Rozumiem, ze forma jest wazna, ale w kodach w szybkiej odp nie znalazlem javy i uzylem quote.
Niemniej, zamiast polajanki wolalbym zobaczyc rade.

0

Używasz [jakiegoś tam] protokołu do odbioru danych, a mimo to próbujesz je wczytać za pomocą FileInputStream? Gdzie tu logika? Skoro masz protokół i pakiety z danymi to zapisuj te dane które odbierasz w pakietach, a nie próbuj otwierać jakichś plików.

0

Bo robie to w NetBeans i klient to localhost? To jedyna odp ktora mi przychodzi do glowy. Nie rozumiem javy, nie rozumiem zachodzacych procesow, nie rozumiem zaleznosci. Nie ma dla mnie sensu. Przeczytalem i obejrzalem taka mase tutow, ze przestalem przyjmowac cokolwiek do wiadomosci. Wypalilem sie. Musze ruszyc do przodu,a nie wiem jak.
Byc moze sie myle, ale dlatego wlasnie prosze o rade.

edyta "rozwiazany" kliknal sie przez przypadek najwidoczniej - nie swiadomie.

0

Skoro przychodzi pakiet z danymi, to wyłuskaj te dane i zapisz do pliku docelowego.

0

Tylko jak? Ogolna idee TFTP rozumiem, przeczytalem 1350 chyba z 10 razy, ale nie potrafie tegoo przelozyc na jave. Im wiecej szukam, tym rozumiem coraz mniej, a raczej gubie sie coraz bardziej

0

Jest na wiki walkthrough: http://en.wikipedia.org/wiki/Trivial_File_Transfer_Protocol#Protocol_walkthrough
Dane są przesyłane za pomocą pakietów DATA i to z ich lub do nich (zależy od trybu) masz zapisywać dane.

Po stronie serwera musisz utrzymywać coś w rodzaju sesji, czyli zapamiętać np tryb działania oraz nazwę pliku na którym operujesz bądź już otwarty file stream. No i na pakiety musisz nasłuchiwać w kółko, działając w zależności od stanu sesji.

Przy case 1 (RRQ) masz otworzyć plik i wysyłać pakiet DATA. Potem nasłuchujesz na ACK i jak dostaniesz to wysyłasz kolejny pakiet DATA, itd aż do ostatniego pakietu DATA.

Tu nie ma prawie żadnej Javowej magii. Wychodzi tylko na to, że nie ogarniasz prostego protokołu i tyle.

1 użytkowników online, w tym zalogowanych: 0, gości: 1