Sockets und InputStream

Status
Nicht offen für weitere Antworten.
M

Malb

Gast
Ich empfange mittels Socket von einem Server einen Inputstream.
Das Problem hierbei ist:

- Ich kann den Inputstream nicht beenden, da der Socket ansonsten auch geschlossen wird (was die Abarbeitung der restlichen Netzwerkprotokols verhindern würde)
- Da ich den Stream aber nicht schließen kann tritt meine "while" Abbruchbedingung aber auch nie ein: while((len = in.read(buf)) > 0)

--> Wie kann ich jetzt aber feststellen ob der Datenstrom zuende ist?

Code:
Code:
InputStream in = null;
            
try
{
   in = socket.getInputStream()
}
catch ...
...
byte buf[] = new byte[puffer];


while((len = in.read(buf)) > 0) 
{   
...
 

Murray

Top Contributor
Du könntest entweder vor den eigentlichen Daten die Länge (in einer definierten Anzahl von Bytes) übertragen, oder aber ein definiertes Ende-Byte (z.B. die 0) verwenden, welches in den zu übertragenden Daten natürlich nicht vorkommen darf. Im ersten Fall wird erst die Länge gelesen und dann eben soviele Bytes, wie die Längeninformation angibt; im zweiten Fall prüft man nach jeder Leseoperation, ob das Ende-Byte empfangen wurde.
 
M

Malb

Gast
OK. Beide Ideen habe ich ins Auge gefasst. Die mit der definierten Länge muss ich leider verwerfen, da ich eine Datei übertrage und erst am Ende weiss wie gross diese ist.

... Werde mich mal an einer -1 als Endezeichen versuchen :)
 
G

Guest

Gast
OK, die -1 funktioniert nicht. Was für einen Wert könnte ich da nehmen?
 

Murray

Top Contributor
Wenn Du die Länge am Anfang noch nicht kennst, dann könntest Du die Ansätze auch mischen:
Du verwendest immer eine feste Blocklänge (z.B. 1024 Bytes). Der Sender schreibt die Datei
dann blockweise, wobei die letzten Bytes eine Blocks keine Nutzdaten enthalten, sondern eine
Kennung, die angibt, an welcher Stelle im Block die Nutzdaten aufhören (der letzte Block wird
ja in der Regel nur zum Teil mit Nutzdaten gefüllt sein; der Rest wird dann z.B. mit Nullen aufgefüllt).
Wenn man jetzt einen Block empfangen hat, sieht man sich die Kennung am Ende an: steht hier eine
Null, so enden die Nutzdaten nicht innerhalb des Blocks; es muss also mindestens ein weitere Block
gelesen werden. Enden die Daten irgendwo innerhalb des Blocks, so muss nicht weitergelesen werden;
vom Block müssen genau soviele Bytes verwendet werden, wie die Kennung angibt.

Damit hat man zwar etwas Overhead beim Traffic erzeugt (weil man ja immer ganze Blöcke schreibt und so i.d.R. mehr Daten überträgt als notwendig), dafür dürfen die Daten dann aber auch sämtliche Byte-Werte enthalten, weil kein Wert als Ende-Kennung reserviert ist.
 
M

Malb

Gast
OK. Diese Lösung wäre denkbar. Habe mich aber schon auf deinen ersten Vorschlag eingeschossen und ihn
implementiert. Und das schönste ist: er funktioniert schon. Habe aus breakbit den Wert -64 verwendet. Leider habe ich jetzt eben eine Datei gefunden, die diesen Wert enthält.

Gibt es nicht einfach einen Bitwert, den garantiert keine Datei enthält? Sowar wie NULL, -1, etc?
 

Murray

Top Contributor
Allgemein gibt es einen solchen Wert nicht; Binärdateien können grundsätzlich alle möglichen Byte-Werte enthalten.
 
M

Malb

Gast
... Schade ... OK, ich habe ja jetzt einen Lösungsweg den ich gehen kann ...
Vielen Dank für deine Mühen :)
 

Tellerrand

Bekanntes Mitglied
Obwohl du eine Lösung schon hast noch ein Ansatz.

Malb hat gesagt.:
Gibt es nicht einfach einen Bitwert, den garantiert keine Datei enthält? Sowar wie NULL, -1, etc?

Gibt es nicht, ... aber:

Beim senden verdoppelst du im Datensegment alle -1 Bytes und ans Ende hängst du -1 0.

Beim empfangen prüfst du jedes Byte auf -1, wenn du eins findest und das nachfolgende Byte auch -1 ist entfernst du eins. Ist das nachfolgende Byte nicht -1 demnach also 0 hast du das Ende erreicht.

Beispiel:

(-1 23 45 -1 21 -24 -1 -1) soll übertragen werden.
Übertragen wird also (-1 verdoppelt, eine -1 0 als Endbytes):
-1 -1 23 45 -1 -1 21 -24 -1 -1 -1 -1 -1 0
Nach der Filterung hätte man dann:
(-1 23 45 -1 21 -24 -1 -1)

0 und -1 sind hier rein willkürlich gewählt.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Problem bei Sockets/InputStream über externe Klasse Netzwerkprogrammierung 5
Jannn Socket Sockets an ein anderes Gerät weiterreichen? Netzwerkprogrammierung 8
JaXnPriVate Java HTTPS Server (Secure Sockets) Netzwerkprogrammierung 15
B Socket Bilder verschicken via Sockets. Heap-Problem. Netzwerkprogrammierung 2
E Socket Parameter über Sockets übergeben und auslesen ! Netzwerkprogrammierung 5
D Socket Verwirrung bei Sockets Netzwerkprogrammierung 1
E Mehrere Sockets Netzwerkprogrammierung 2
N Fragen zu Sockets Client Netzwerkprogrammierung 3
A Sockets Serialisierung Netzwerkprogrammierung 1
K Threads closen und Sockets schliessen Netzwerkprogrammierung 5
H Sockets oder HTTP- Methoden? Netzwerkprogrammierung 3
T Socket Bidirektionale Verbindung mit Sockets Netzwerkprogrammierung 8
P Problem mit Datagram-Sockets Netzwerkprogrammierung 2
C Socket Datagram-Sockets mit integrierter Message Queue? Netzwerkprogrammierung 2
M Problem Client - Server Sockets: .ready() wird nie true! Netzwerkprogrammierung 6
F Technologiewahl: Swing/RMI/Sockets Netzwerkprogrammierung 13
B Sockets, Threads & Plugins Netzwerkprogrammierung 7
T Verbindungsversuche über TCP Sockets von mehreren Threads führt zu Serverabsturz Netzwerkprogrammierung 2
D Mehrere Clients über Java-Sockets Netzwerkprogrammierung 13
F FTP Client mit Sockets - wann sagt der Server nichts mehr? Netzwerkprogrammierung 7
U Socket Abhören eines Sockets/Ports in extra Thread Netzwerkprogrammierung 8
M Socket Sockets Grundlage Netzwerkprogrammierung 25
I Socket HTTP Nachrichten über Sockets verschicken Netzwerkprogrammierung 2
D Socket Raw Sockets mit java.net.*? Bsp ICMP Netzwerkprogrammierung 7
H Komprimierte Sockets Netzwerkprogrammierung 4
V Verbindung zweier Rechner über das Internet mit Sockets Netzwerkprogrammierung 8
L Sockets übergeben Netzwerkprogrammierung 4
G NIO Sockets Architektur Problem Netzwerkprogrammierung 2
S Problem bzgl. Sockets / Server-Client-Struktur Netzwerkprogrammierung 3
B Socket Was muss man bei Sockets beachten? Netzwerkprogrammierung 10
N Socket Sockets und Events Netzwerkprogrammierung 11
A Programm umschreiben von Pipes auf Sockets Netzwerkprogrammierung 12
B Paralleler Dateitransfer: Ein Client - Mehrere Sockets? Wie connecten? Netzwerkprogrammierung 16
D RMI oder Sockets Netzwerkprogrammierung 4
P Sockets +Port Forwarding = Chaos Netzwerkprogrammierung 4
clupus Exception beim Schließen eines Sockets Netzwerkprogrammierung 6
Q Thread und Sockets... Netzwerkprogrammierung 2
G Sockets und HTTP: Ende des Datenempfangs erkennen Netzwerkprogrammierung 3
J Array oder Object über Sockets Netzwerkprogrammierung 8
O Sockets -- Einsieg Netzwerkprogrammierung 3
S Sockets und gzip Netzwerkprogrammierung 8
B Nachricht über Sockets kommt nicht an Netzwerkprogrammierung 8
data89 Sockets: ein alter Hut - für Euch - für mich nicht! Netzwerkprogrammierung 10
S Wiedereinmal Sockets ;-) Netzwerkprogrammierung 15
J Ascii / Unicode bei Sockets? Netzwerkprogrammierung 2
G Datagram-Sockets für UDP-Kommunikation Netzwerkprogrammierung 2
K "Ende eines Sockets" Netzwerkprogrammierung 9
A Sockets Netzwerkprogrammierung 10
feuervogel Sockets - Lokalen Port aber nicht IP bestimmen Netzwerkprogrammierung 3
C Einfacher Filedownload mit Sockets geht nicht für pdffiles Netzwerkprogrammierung 16
E Sockets, readLine() Netzwerkprogrammierung 7
G Verbindung über Sockets Netzwerkprogrammierung 2
S zip-files über sockets übertragen Netzwerkprogrammierung 11
G immer wieder gleiche Sockets Netzwerkprogrammierung 2
V Suche Alternative zu Sockets Netzwerkprogrammierung 3
A Datenverlust (zuviele Daten!) über Sockets Netzwerkprogrammierung 4
AlClemento Sockets -> BufferedReader Problem Netzwerkprogrammierung 2
F Problem mit Threads und Sockets Netzwerkprogrammierung 3
B Übertragung via Sockets Netzwerkprogrammierung 12
C Dateien über Sockets versenden? Netzwerkprogrammierung 10
T Sockets Verständnisfrage: abwechelnd lesen-schreiben Netzwerkprogrammierung 4
S Habe ein Problem mit Sockets -> Client Server Netzwerkprogrammierung 2
G Strings über Sockets senden Netzwerkprogrammierung 5
P Probleme mit einem Array aus Sockets Netzwerkprogrammierung 2
Y buch: Netwerprogrammierung und Sockets Netzwerkprogrammierung 2
B Eigenes Protokoll über Sockets verschicken Netzwerkprogrammierung 4
P Welche Art von Sockets für ein Spiel? Netzwerkprogrammierung 3
C Sockets über Internet Netzwerkprogrammierung 10
K Applet - Servlet Kommunikation ohne Sockets Netzwerkprogrammierung 5
S Objekte zwischen Client und Server über Sockets senden Netzwerkprogrammierung 2
Z chat: wann http und wann sockets verwenden? Netzwerkprogrammierung 11
D Java Sockets Probs Netzwerkprogrammierung 4
N Verarbeitung nach Weiterleitung in Sockets Netzwerkprogrammierung 2
A Serialisierung über Sockets möglich? Netzwerkprogrammierung 3
M sockets (security) Netzwerkprogrammierung 2
C IRC CHAT auslesen -> Sockets/input und output Streams Netzwerkprogrammierung 9
L Socket Wie kann man in Java die Anzahl der Objekte in einem InputStream sehen ohne ihn durchgehen zu müssen Netzwerkprogrammierung 1
S Socket String InputStream in hex umwandeln Netzwerkprogrammierung 1
D GZIP InputStream lesen ohne zu encoden Netzwerkprogrammierung 1
F Java Server Scanner oder InputStream kann nicht gelsesen werden! Netzwerkprogrammierung 6
R Socket InputStream readObject > Connection Reset Netzwerkprogrammierung 3
windl InputStream cachen Netzwerkprogrammierung 3
K Socket InputStream wird nicht erzeugt Netzwerkprogrammierung 4
M Socket InputStream liest nicht vollständig Netzwerkprogrammierung 7
M Was macht Thread, wenn er aus einem "leeren" Inputstream liest ? Netzwerkprogrammierung 5
K Byte für Byte aus InputStream lesen Netzwerkprogrammierung 5
F JSch - inputstream is closed Netzwerkprogrammierung 13
M Socket InputStream sendet ausgaben von OutputStream zurück Netzwerkprogrammierung 2
D Inputstream to Outputstream Netzwerkprogrammierung 3
M InputStream and ObjectInputStream zur gleichen Zeit Netzwerkprogrammierung 11
T Inputstream -> verschiedene Objekte lesen Netzwerkprogrammierung 3
MQue Inputstream Timeout Netzwerkprogrammierung 2
S Servlet InputStream leer?! Netzwerkprogrammierung 14
G HTTP-Request InputStream-Problem Netzwerkprogrammierung 5
P Inputstream "verfügbar" Netzwerkprogrammierung 4
G JPG im InputStream Netzwerkprogrammierung 2
A InputStream liest immer komplettes PHP-Script Netzwerkprogrammierung 6
A InputStream ließt nur 65536 Zeichen anstatt ganzer Puffer Netzwerkprogrammierung 8
A inputstream teilen? Netzwerkprogrammierung 4
D InputStream (Socket) mit BufferedInputStream puffern Netzwerkprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben