Socket Daten lesen ohne Längenangabe

kennux

Mitglied
Hallo Forum,
Ich bin eben auf dieses Forum per google gestoßen und möchte mal fragen,
Wie ich Daten aus einem Socket (Mit dem BufferedReader) auslesen kann, ohne dass ich eine längen angabe habe.
readLine() würde nicht funktionieren, da in den Daten kein \n ist.
Es sind mit rc4 verschlüsselte Pakete. readLine() lässt also den SocketThread freezen.

Ich wäre über jede Hilfe sehr dankbar :)
 

Blakh

Bekanntes Mitglied
Kenne mich nicht mit rc4 aus, aber gibts dafür keinen decoder, wenn du das encoded hast?

Ansonsten wäre es möglich mit einer while-Schleife bis zum Ende des Stream per read() zu lesen und das dann manuell zusammenbauen.
 

kennux

Mitglied
Ja, das ist mir auch schon eingefallen. Ich könnte die Daten theoretisch mit ner Buffer Methode lesen, aber das ist mir eigentlich zu umständlich.
Wer nicht weis, wie die Daten mit RC4 gesendet werden:
Hexadezimal (z.B. FFEEAA = 3 char's)
Daher habe ich auch keinen Endpunkt.
 

kennux

Mitglied
Okay, ich werd das mal eben versuchen. Weist du evtl. wie ich die länge der Daten im Stream herausbekomme (für das erstellen des Arrays)?
 

Blakh

Bekanntes Mitglied
Da es ein Stream ist, kannst du es nicht wissen. Aber wenn du ein bufferedReader hast, dann kannst du dir ja ein String zusammenbauen.

Java:
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
char[] cb = new char[1];

String hallo = "";
while(br.read(cb) != -1) {
     hallo = hallo + new String(cb);
}

Keine Garantie, dass das die beste Lösung ist. Mir fällt aber nix anderes ein, außer du erstellst bis zu einer Grenze immer wieder neue Buffer, bis das Ende des Streams erreicht ist.
 

kennux

Mitglied
Funktioniert auch soweit ganz gut, nur der Code danach (Wenn ich es mit System.out.println() ausgeben will) läuft nicht durch. Das gesamte Thread feezed dann. Ich weis auch nicht, wodran das liegt.
Im Debugmodus bekommt er die Paketdaten ganz brav aber er läuft einfach nach dem while nicht weiter (auch nach dem die Schleife durch ist, hab mit Breakpoints geschaut).
Edit://
Hier ist der Code:

Java:
char[]buffer = new char[1];
String tmp_rc4 = "";
while(in.read(buffer) != 1) {
	tmp_rc4 = tmp_rc4 + new String(buffer);
}
System.out.println(tmp_rc4); // Hier bleibts hängen. Es wird nix ausgegeben und läuft ned weiter.
 
Zuletzt bearbeitet:

Blakh

Bekanntes Mitglied
Also wieso hast du denn das:

Java:
while(in.read(buffer) != 1)

read() liefert doch beim Ende eine -1 .

Hast du beim debuggen mal geschaut, ob dein String richtig aufgebaut wird?
 

kennux

Mitglied
Ah, hab's nur falsch abgeschrieben. Programmiere den Server auf meinem Laptop (Keine Internetverbindung). Habe im SourceCode -1 stehen.
 

Michael...

Top Contributor
Die while Schleife läuft solange die Verbindung noch offen ist.
Entweder Du beendest die Verbindung zwischen Server und Client.
Oder benutzt für die Kommunikation ein Protokoll.
 

Blakh

Bekanntes Mitglied
Wäre natürlich auch eine Möglichkeit. Wenn du selbst rc4 Daten sendest, kannst die nochmal in ein Container packen, damit du weisst, wann eine Nachricht zu Ende ist. Ansonsten wirst du wohl die Verbindung jedes mal schliessen müssen (Server-Seite). Oder vllt. hilft ein flush() ?
 

Blakh

Bekanntes Mitglied
Hab grad was gefunden (arbeite auch z.Z. mit sockets etc.)

If there are no bytes buffered on the socket, and the socket has not been closed using close, then available() will return 0.

Also versuch mal sowas:
Java:
while (socket.getInputStream().available() != 0) { 
     .... String zusammenbauen ...
}
 

agentone

Bekanntes Mitglied
Java:
tmp_rc4 = tmp_rc4 + new String(buffer);

Für solche Sachen bitte den StringBuilder verwenden. Das liegt daran, das beim 'addieren' von Strings immer wieder ein neues Stringobjekt erstellt wird, und folglich immer wieder Platz geschaffen werden muss. Außerdem muss das alte Stringobjekt immer wieder gelöscht (durch gc) werden. Bei langen Strings kommt es deshalb zu echten Performance-Problemen!

Also besser so:
Java:
StringBuilder builder=new StringBuilder();
char c;
while((c=in.read()) != -1) {
   builder.append(c);
}
String fertigerString=builder.toString();
(nicht getestet)
 

kennux

Mitglied
So, erstmal danke für die Antworten. Das mit dem != -1 funktioniert irgendwie nicht.
Das mit dem available() werd ich noch testen. Ich kann das Protokoll nicht verändern, da das ein kleines Private Server projekt ist.
Ich poste, wenn ich das mit available() getestet hab.

Edit://
Hab's gelöst bekommen. Danke!
 
Zuletzt bearbeitet:

ice-breaker

Top Contributor
Es kann gar nicht korrekt funktionieren.
Daten werden über das Netzwerk/Internet in kleine Packages aufgeteilt, was du mit einem Befehl über die Leitung sendet, kann in echt in 20 einzelnen Paketen ankommen.
Das wäre soweit natürlich noch kein Problem, jedoch folgt daraus auch, dass wenn 2 Nachrichten hintereinander verschickt werden, es unbekannt ist, wo die eine Nachricht aufhört und die andere anfängt, oder ob eine Nachricht überhaupt schon komplett empfangen wurde.

Du musst also entweder einen Delimiter zum Trennen implementieren (NUL-Byte, \n) oder vor einem Paket eine Größenangabe als 4Byte Integer vorrausschicken, also nach dem Motto: es folgt eine Nachricht von x Bytes.

Pseudocode:
Code:
byte b[] = read4Byt();
int len = b[] in integer umwandeln

while geleseneBytes < len
  bytes von Stream lesen



PS.: Available kann auch nicht funktionieren, wirf einen Blick in die Java-Dokumentation zu InputStream.available()
 

Blakh

Bekanntes Mitglied
Das steht aber bei Socket.getInputStream() in der API ...

If there are no bytes buffered on the socket, and the socket has not been closed using close, then available will return 0.

Im Umkehrschluss heißt das für mich: Wennd a noch was ist, dann ist available() ungleich 0. Ich erinner mich dunkel, dass ich das damit mal probiert hatte und es funktionierte.

Aber bei dem Rest stimme ich ohne bedenken zu. Ohne einen definierten Endpunkt kann es sein, dass du nur halbe Nachrichten dekodierst etc.
 

ice-breaker

Top Contributor
K, kann möglich sein, InputStream.available() gibt per Default aber immer 0 zurück, wenn der Socket einen InputStream zurückliefert, der diese Eigenschaft erfüllt, kann er zwar lesen, wieviele Daten noch im Buffer stecken, das Problem mit dem erkennen der Nachrichtengrenzen besteht aber noch immer.
 

kennux

Mitglied
Es war etwas mit der RC4-Klasse! Ich kann wenn z.B.
A3FD10E5 gesendet wird ist bei dem Privateserver das erste Byte immer "@", dann kommt eine Längenverschlüsselung (immer 2 Bytes) und dann der Header + Daten.
Ich habe dann anhand von dem String (A3FD10E5) erstmal die ersten 6 Bytes ausgelesen (rc4 macht 3 Bytes wegen Hexadezimal draus), dann die Länge gesplittet und dann die länge mal 2 (Wegen RC4) ausgelesen und boom, das paket kommt perfekt an (Wusste nicht, dass ich die Paketteile einzeln durch die RC4 jagen kann :D)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Z Kann nicht Daten vom Server lesen Socket Netzwerkprogrammierung 10
S Thread, Daten vom Socket lesen Netzwerkprogrammierung 2
OnDemand Daten per API senden, parallel Netzwerkprogrammierung 9
X Kann ich einen Client/Server verbindung hinkriegen die mir alle paar Sekunden die aktuellen Daten per Realtime zuschickt ? Netzwerkprogrammierung 9
S Daten über TCP/IP senden Netzwerkprogrammierung 3
B Daten an Javaprogramm per URI Aufruf übergeben Netzwerkprogrammierung 7
N websocket - keine Daten mehr nach ca 80 Sekunden Netzwerkprogrammierung 0
C Spezielle Daten aus Website entnehmen Netzwerkprogrammierung 5
H Daten auf einer Webseite eintragen Netzwerkprogrammierung 11
A Socket Daten in Textdokument speichern? Netzwerkprogrammierung 1
T Socket Java Programm hängt sich auf bei dem versuch von einem Socket scanner Daten zu erhalten. Netzwerkprogrammierung 1
J Daten von einem HTML-Textfeld abrufen Netzwerkprogrammierung 3
S Fakturierungsprogramm - Daten aktuell halten (blutiger Anfänger) Netzwerkprogrammierung 1
D Mit Server Daten austauschen Netzwerkprogrammierung 4
K Server liest Daten nicht Netzwerkprogrammierung 6
L HTTP Daten an Server übergeben Netzwerkprogrammierung 2
R Daten von Cloud laden Netzwerkprogrammierung 5
fLooojava Daten an ein Arduino im selben Netzwerk senden Netzwerkprogrammierung 1
X Daten können nicht sofort empfangen werden Netzwerkprogrammierung 1
S Server - Mehrere Klassen sollen Daten senden und empfangen Netzwerkprogrammierung 25
P Socket Best Practice: Daten bündeln Netzwerkprogrammierung 5
E Verfügbarkeit von Daten in Streams Netzwerkprogrammierung 4
F Daten aus Internetseiten auslesen Netzwerkprogrammierung 56
S Server Client Daten hin und herschicken Netzwerkprogrammierung 2
S Seltsames Verhalten beim Empfangen von Daten über DataInputStream Netzwerkprogrammierung 12
P Socket Daten senden mit ServerSocket? Netzwerkprogrammierung 2
H Daten an Textfeld einer Webseite schicken Netzwerkprogrammierung 2
A versch. Daten im Stream erkennen Netzwerkprogrammierung 2
D daten per post senden Netzwerkprogrammierung 3
M Senden von Daten nicht direkt möglich? Netzwerkprogrammierung 6
J Applet soll Daten auf Server ablegen - einfachster Weg fuer n00bs? Netzwerkprogrammierung 4
F Socket Daten über verschiedene IP's schicken Netzwerkprogrammierung 5
F UDP Daten kommen nicht an Netzwerkprogrammierung 22
E Socket OutputSream abbruch.Wegen zuviel !empfangener! Daten? Netzwerkprogrammierung 10
C Client zu Client Daten übertragen Netzwerkprogrammierung 13
S Socket XML-Daten und Parameter an Server schicken Netzwerkprogrammierung 3
M Objekt über Object-Stream, empfange "alte" Daten Netzwerkprogrammierung 2
P HttpClient - Daten einer Website "unvollständig" Netzwerkprogrammierung 5
P Server/Client Daten empfangen, wenn Daten gesendet werden Netzwerkprogrammierung 9
T RMI Effizenteste Übertragung von Daten Netzwerkprogrammierung 6
A Socket Client Server Connection wird aufgebaut aber keine daten geschickt. Netzwerkprogrammierung 5
B Socket Daten empfangen funktioniert nicht richtig - wo liegt der Fehler? Netzwerkprogrammierung 7
Kr0e Versenden von Daten übers Netzwerk Netzwerkprogrammierung 30
E Daten kommen anders an als gesendert ?! Netzwerkprogrammierung 6
S HttpURLConnection POST splittet Daten in zwei Pakete Netzwerkprogrammierung 9
F POST-Daten sende Netzwerkprogrammierung 3
E HTTPS Debuggen (verschlüsselte Daten anzeigen)? Netzwerkprogrammierung 12
N Per POST -Methode Daten an den Web-Server übertragen. Netzwerkprogrammierung 9
Iron Monkey Große Daten ins Vector füllen Netzwerkprogrammierung 4
S Probleme beim senden von Daten per POST Methode an PHP Scrip Netzwerkprogrammierung 5
D Daten, die mit PHP erzeugt werden, mit Java auslesen Netzwerkprogrammierung 8
M Ethernet Daten abfangen Netzwerkprogrammierung 13
F Daten senden und empfangen mit Applet Netzwerkprogrammierung 8
I Problem beim empfangen von Daten (Zahlen) Netzwerkprogrammierung 7
S Daten per GET-Methode Netzwerkprogrammierung 2
H Server soll Daten schicken, aber wie? Netzwerkprogrammierung 47
M Socket schließt bevor Daten komplett geladen Netzwerkprogrammierung 5
C Flash Daten an Java senden, wie serialisieren? Netzwerkprogrammierung 3
E rxtx serielles senden von Daten Netzwerkprogrammierung 2
D Socket, Daten über BufferedWriter senden Netzwerkprogrammierung 18
G TCP Verbindung überprüfen OHNE daten zu verschicken Netzwerkprogrammierung 11
M Daten übers Netz verschlüsselt übertragen? Wie? Netzwerkprogrammierung 18
J Post-Daten an URL schicken Netzwerkprogrammierung 2
U Image erzeugen aus empfangenen Daten Netzwerkprogrammierung 7
A Wie werden Daten versendet? "Crashcode" Netzwerkprogrammierung 4
D Frage: Buffered Reader --> Wie komm ich an die Daten (Byt Netzwerkprogrammierung 3
G unvollständige Daten: Http Client-Server-Kommunikation Netzwerkprogrammierung 2
E Multi-Part Form-Daten mit HttpURLConnection Netzwerkprogrammierung 6
A Datenverlust (zuviele Daten!) über Sockets Netzwerkprogrammierung 4
T Daten über GSM verschicken Netzwerkprogrammierung 4
M Einfachste Möglichkeit aus'm Applet Daten an Server senden Netzwerkprogrammierung 6
P Verschiedene Daten über einen Stream Netzwerkprogrammierung 4
M Verliere Daten mit WinXP Netzwerkprogrammierung 10
O eingehende Daten speichern Netzwerkprogrammierung 3
D UDP-Daten anzeigen Netzwerkprogrammierung 2
D Daten per Server- Client nur als byte verschicken? Netzwerkprogrammierung 3
A daten an php script per post senden und ausgabe einlesen Netzwerkprogrammierung 6
W Socket Server -> lesen von / schreiben zu php-script Netzwerkprogrammierung 6
B Versuch mit Socket etwas zu lesen und zu schreiben Netzwerkprogrammierung 15
OnDemand Json Objekt leeres Array beim lesen Netzwerkprogrammierung 9
I Offene Verbindungen lesen(Ressourcenmonitor lesen) Netzwerkprogrammierung 2
A FTP wie kann ich von java auf datei in fpt://192.168.178.1 lesen/schreiben? Netzwerkprogrammierung 3
C Gerenderte Website nach der ausführung von JavaScript als HTML Code aus lesen Netzwerkprogrammierung 4
B Java+Grbl: G-Code Befehle mit Java an Arduino senden und lesen Netzwerkprogrammierung 1
M TCP Verbindung Byte-weise lesen? Netzwerkprogrammierung 5
D GZIP InputStream lesen ohne zu encoden Netzwerkprogrammierung 1
L FTP Lesen einer Datei vom Server - Aufgehangen Netzwerkprogrammierung 0
C Datei über Socket schreiben und Ereignis lesen Netzwerkprogrammierung 9
B Socket Aufhängen beim Lesen Netzwerkprogrammierung 4
C Socket Probleme beim Lesen und Schreiben aus/in einen Socket Netzwerkprogrammierung 2
D Aus einer URL die Dateien lesen Netzwerkprogrammierung 5
P FTP Nochmal wachsende Datei per FTP lesen Netzwerkprogrammierung 9
P Wachsende Datei per FTP lesen Netzwerkprogrammierung 2
K Byte für Byte aus InputStream lesen Netzwerkprogrammierung 5
J VideoStream von Webseite lesen/speichern Netzwerkprogrammierung 7
J UDP port packete lesen,wenn dieser besetzt ist Netzwerkprogrammierung 3
Z File über Socket lesen Netzwerkprogrammierung 3
W aktuelle Datum vom Server lesen! Netzwerkprogrammierung 5
T Inputstream -> verschiedene Objekte lesen Netzwerkprogrammierung 3
T Socket Nullterminierten String lesen Netzwerkprogrammierung 4

Ähnliche Java Themen


Oben