File über Socket verschicken?

3 Antworten

Ich gehe mal davon aus, dass es um Java geht.

In Java stehen beim Socket ein Output- und InputStream zur Verfügung. Über den OutputStream versendest Du eine Nachricht und über den InputStream empfängst Du eine Nachricht.

Um eine Datei über einen Socket zu versenden, müsstest Du die vorher einlesen und dann in den Outputstream schieben.

Bei wikibooks.org gibt es dazu ein gutes Beispiel. Dort wird zwar eine Textnachricht versendet, aber das lässt sich auf andere Dinge übertragen.

Woher ich das weiß:
Studium / Ausbildung

Das Hauptproblem dabei dürfte sein, dass auf Empfängerseite bekannt sein muss, wie groß die Datei genau ist, um korrekt auf das Ende der Übertragung reagieren zu können.

Sofern also nicht jede Datei exakt die selbe Größe hat, müsstest du ein entsprechendes Protokoll implementieren.

Im einfachsten Fall könnte das z.B. so aussehen:

  1. Der Sender überträgt 2 Bytes an den Empfänger, mit denen die Länge des Dateinamens in Bytes angegeben wird.
  2. Der Sender überträgt den Dateinamen in Bytes.
  3. Der Sender überträgt 8 Bytes, mit denen die Länge des Dateiinhaltes angegeben wird.
  4. Der Sender übeträgt die Dateidaten.

In Codeform also ungefähr so:

public static void sendFile(Socket socket, String filename){
    OutputStream socketOutputStream = socket.getOutputStream();
    byte[] data_buffer = filename.getBytes("UTF-8");
    byte[] size_buffer = new byte[]{(byte)((data_buffer.length>>8)&0xff), (byte)(data_buffer.length&0xff)};
    socketOutputStream.write(size_buffer, 0, size_buffer.length);
    socketOutputStream.write(data_buffer, 0, data_buffer.length);
    File file = new File(filename);
    long filesize = file.length();
    size_buffer = new byte[]{ (byte)((filesize>>56)&0xff), (byte)((filesize>>48)&0xff), (byte)((filesize>>40)&0xff), (byte)((filesize>>32)&0xff), (byte)((filesize>>24)&0xff), (byte)((filesize>>16)&0xff), (byte)((filesize>>8)&0xff), (byte)(filesize&0xff) };    
    socketOutputStream.write(size_buffer, 0, size_buffer.length);
    data_buffer = new byte[0xffff];
    int chunk_size;
    long sent_size = 0;
    FileInputStream fileInputStream = new FileInputStream(file);
    while(sent_size < filesize){
        chunk_size = fileInputStream.read(buffer, 0, buffer.length);
        socketOutputStream.write(buffer, 0, chunk_size);
        sent_size += chunk_size;
    }
}

Und auf Empfängerseite natürlich das entsprechende Gegenstück.

ACHTUNG: Das ganze ist überaus rudimentär und ausserdem müssen noch alle möglichen Exceptions berücksichtigt werden, aber als grobe Skizze sollte es hoffentlich genügen.

32

Nachtrag: Du könntest natürlich auch einfach die Dateidaten direkt in den blanken Stream werfen und als Signal für das Übertragungsende einfach die Verbindung kappen, aber das wäre, gelinde gesagt, saumäßig unsauber. (Aber es würde "funktionieren"...)

0

Java - Netzwerk Client eindeutige ID vom Server zuweisen

Hey Leute, um an meinem kleinen Programm weiter zu kommen muss der Server dem Client eine eindeutige ID zuweisen, damit dieser weiß, ob er Client 1 oder 2 ist. Leider hab ich keine Ahnung wie ich das anstelle. Momentan können zwar zwei Rechtecke über 2 verschiedene Clients bewegt und gesehen werden allerdings muss ich dazu immer ein ganz neues Datenpaket erstellen und die alten komplett überschreiben. Um das jeweilige DP, das zum Client gehört, nur zu verändern brauche ich die ID des Clients. Das ganze Programm soll also nur mit 2 DP, die nie ersetzt sondern nur über Setter verändert werden, laufen. Immo sieht mein Code so aus:

Das ganze ist auf pastbin zu finden.

client: pastebin.com/Wgfwnqn5

datenpaket: pastebin.com/3MhLPCLF

frame: pastebin.com/h2GU01K9

server: pastebin.com/H7wsdvUy

spieler: pastebin.com/BwedBxm5

startServer: "pastebin.com/CDtZQcJC

tastatur: pastebin.com/rqw6Qrk4

Wäre cool, wenn jemand wüsste, wie ich dem Client gleich eine ID vom Server gebe wenn der Thread startet. Der zum Client dazugehörige Thread kennt die ID des Clients jedoch nicht der Client die ID des Threads.

Ist noch alles ziemlich durcheinander aber das zu verbessern lohnt sich erstmal nicht, bis mein momentanes Problem gelöst ist.

MFG =)

...zur Frage

Was möchtest Du wissen?