Streams: merkwürdiges Verhalten

Status
Nicht offen für weitere Antworten.

alshir

Mitglied
Auszug aus Server:
Code:
InputStream in = client.getInputStream();
         BufferedInputStream bis = new BufferedInputStream( in );
         BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream( file ) );

         byte[] buffer = new byte[1024];
         int readbytes = 0;
         int receivebytes = 0;
         
         System.out.println( "Empfange Datei" );
         while( ( readbytes = bis.read( buffer ) ) != -1 ) {
            bos.write( buffer, 0, readbytes );
            receivebytes += readbytes;
         }
         System.out.println(receivebytes + " aus dem BufferedInputStream gelesen");

Ausgabe: 56512512 aus dem Stream gelesen

Auszug aus Client:
Code:
OutputStream out = server.getOutputStream();
         BufferedOutputStream bos = new BufferedOutputStream( out );
         BufferedInputStream bis = new BufferedInputStream( new FileInputStream( file ) );

         byte[] buffer = new byte[1024];
         int readbytes = 0;
         long sendbytes = 0;
         
         System.out.println( "Beginne Filetransfer" );
         while( ( readbytes = bis.read( buffer ) ) != -1 ) {
            bos.write( buffer, 0, readbytes );
            sendbytes += readbytes;
         }
         System.out.println(sendbytes + " in den BufferedOutputStream geschrieben");
Ausgabe:56512858 in den Stream geschrieben

Kann mir einer sagen, warum ich auf dem Weg von einem zum andern Stream - das ganze kommuniziert über Sockets - 346 Bytes verliere ???

mfg
alshir
 
Habe danach ge-flush-t, aber es hat nichts verändert. Weder ein bos.flush IN noch NACH der Schleife. Auch beide zusammen haben nicht geholfen.

EDIT: Ach der flush() im Client hat gefehlt. Habe den Fehler immer im Server gesucht, da der Client ja offensichtlich richtig arbeitete ... was aber nicht so war. Jetzt gehts.

Thx 4 help

mfg
alshir
 
Nur mal so als Anmerkung (nicht direkt zum Thema).
Bei DeflaterOutputStream (GZIP etc.) muss man die Ausgabe,
anders als bei anderen Streams, mit finish() abschliessen.
 
Mir ist da noch eine Merkwürdigkeit aufgefallen.

Wenn ich das Programm mit GUI ausführe, funktioniert es einwandfrei, solange ich nur eine Datei übertrage.
Sobald ich allerdings die zweite Datei in dem immernoch offenen Programm verschicken will, hat er noch Datenmüll im Stream, der sich dann folgendermaßen äussert: Der empfangene long ist: "8316300705153444352"
Anscheinend reichen die folgenden Befehle nicht aus, um einen Stream und/oder Socket sauber zu schliessen:
Code:
bis.close();
bos.close();
br.close();
dis.close();
serversocket.close();
client.close();

Das sind auch wirklich alle offenen Streams auf Serverseite. Auf Clientseite werden auch alle Streams und Sockets mithilfe des close Befehls geschlossen.

Achso es ist ausserdem noch zu sagen, dass wirklich alles geflusht wurde, was geflusht werden kann.

mfg
alshir
 
Erstellst Du serverseitig den Serversocket immer wieder neu oder wie?
Mach das serversocket.close(); weg.
Es sollte einmalig für die gesamte "Lebesdauer" der Servers geöffnet bleiben.
z.B.
Code:
public void run()
{
  ...
  Socket clientConnection = serversocket.asccept(); // auf eingehende Verbindungen lauschen
  launchConnectionHandler(clientConnection); // asynchron; nicht blockierend!
  ...
}

serversocket.close() nur beim Beenden des Servers und wenn kein ClientConnectionHandler-Thread
noch aktiv ist.
 
Natürlich schliesse ich den Server nach dem Empfang der Datei.
Schliesslich soll das Programm nur nach betätigen des "Receive File" Knopfs in den Empfangsmodus gehen, dass heisst einen offenen lauschenden Socket haben.

EDIT: Ich weiss ja nicht warum, aber im Moment scheint es zu gehen. Vielleicht lag das Problem daran, dass ich zu schnell nach dem Schliessen des Sockets wieder einen neuen aufgemacht habe.

mfg
alshir
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben