Bytes aus Socket lesen

J

jessy

Gast
Hallo,

ich habe nun schon wirklich alles versucht und weiß nicht woran es liegt. Folgende Codezeile:

... while((readByteCount = socket.getInputStream().read(bArr)) != (-1)) ...

Hier belibt das Programm hängen, egal wie ich es drehe und wende. Kann mir jemand helfen?


Viele Grüße
 
S

SlaterB

Gast
'hängen bleiben' ist ein dehnbarer Begriff

richtig ist, dass das Lesen mglw. blockiert wie auch ein Lesen aus der Konsole, bis der Socket geschlossen wird,
vorher wirst du jedenfalls kein -1, das Zeichen für Ende des Streams, bekommen

wenn der Sender alles sendet und den Socket gleich schließt kann der Client sowas machen,
ansonsten nach Protokoll darauf achten, wann wieviel kommt bzw. damit leben dass es ein träger Thread ist, der Pause macht

----

ich denke dabei immer an zweistufige Variante: ein Thread schaut die ganze Zeit nach und ist sonst blockiert, ein zweiter Thread kann arbeiten und ab und zu evtl. auf fertige Ergebnisse des ersten schauen, damit arbeiten oder sonst weitermachen,

vergleiche Schmiere stehen beim Einbruch ;)

vielleicht hilft auch noch die available()-Methode des Streams, aber die sagt möglicherweise nichts aus ohne selber nachschauen zu müssen, ergo blockiert, dreht sich im Kreis, irgendjemand muss schon warten
 
Zuletzt bearbeitet von einem Moderator:
J

Jessy

Gast
Hallo und danke für deine schnelle Antwort. Ich verstehe leider deinen letzten Satz nicht: "ansonsten nach Protokoll darauf achten, wann wieviel kommt bzw. damit leben dass es ein träger Thread ist, der Pause macht". Was ist ein Träger-Thread? Ist es nicht möglich bytes über eine persistente Verbindung zu senden?
 
J

Jessy

Gast
Das heißt, wenn ich jetzt beispielsweise einen HTTP-Server implementieren wollte, samt Keep-Alive, wäre das in Java nicht möglich?
 
J

Jessy

Gast
Also ich werde noch verrückt. Ich möchte doch einfach nur ein paar Bytes an einen Server schicken und der soll sie wieder zurück zum Client schicken. Ist das in Java nicht möglich? Zuerst muss man den Server und dan den Client testen. Kann mir jemand sagen, warum das read(), egal wie ich es drehe und schiebe nichts liest bzw. was ich hier ändern muss?

Viele Dank im Voraus :)

Hier mal mein kompletter Code:
Code:
import java.io.*;
import java.net.*;

public class AdvancedEchoServer implements Runnable {
	private int port;
	private ServerSocket serverSocket;
	
	public AdvancedEchoServer(int port) {
		this.port = port;
		try {
			this.serverSocket = new ServerSocket(port);
		} catch (Exception e) {
			System.out.println("error while initializing server");
		}
		System.out.println("started server on port " + port);
	}
	
	public void run() {
		System.out.println("server is waiting for clients");
		try {
			Socket socket = serverSocket.accept();
			System.out.println("client has connected to server");
			
			BufferedInputStream in = new BufferedInputStream(socket.getInputStream());
			BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());
			
			byte[] bArr = new byte[1024]; 
			int readByteCount;
			ByteArrayOutputStream bOut = new ByteArrayOutputStream();
			while((readByteCount = socket.getInputStream().read(bArr, 0, 1024)) != (-1)) bOut.write(bArr, 0, readByteCount);
			bOut.flush();
			byte[] readBytes = bOut.toByteArray();
			System.out.println("SERVER:" + new String(readBytes));
			
			out.write(readBytes);
			out.flush();
			
			in.close(); out.close(); bOut.close();
		} catch (IOException e) {
			System.out.println("error while server was running");
		}
	}
	
	public static void main(String[] args) {
		new Thread(new AdvancedEchoServer(8082)).start();
	}
}

Code:
import java.io.*;
import java.net.*;

public class ClientTester {
	private Socket socket;
	
	public ClientTester(String msg) {
		try {
			socket = new Socket(InetAddress.getLocalHost(), 8082);
			
			BufferedInputStream in = new BufferedInputStream(socket.getInputStream());
			BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());
			out.write(msg.getBytes()); out.flush();
			
			ByteArrayOutputStream bOut = new ByteArrayOutputStream();
			int readByteCount;
			byte[] bArr = new byte[1024];
			while((readByteCount = socket.getInputStream().read(bArr, 0, 1024)) != (-1)) {
				bOut.write(bArr, 0, readByteCount);
			}
			System.out.println("2");
			bOut.flush();
			
			System.out.println("CLIENT: " + new String(bOut.toByteArray()));
			
			in.close(); out.close(); bOut.close();
			
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		new ClientTester("Das ist ein Test");
	}
}
 
S

SlaterB

Gast
siehe mein Link mit available() und nur so viel einlesen, das 'könnte' eine Lösung sein,
aber bedenke auch immer, dass hier verschiedene Prozesse zeitlich zusammenspielen,

wer sagt, dass alle Daten schon da sind wenn available() ausgeführt wird, wenn nicht dann für immer Abbruch?

in deinem Fall könnten die Schleifen zumindest einmal aktiv werden, wenn die ersten bytes da sind,
schreibe System.out.printnl(..)-Log-Ausgaben in die Schleifen,

wenn der Server auch noch ein flush() in der Schleife beim Zurückschicken hätte,
könnte ich mir vorstellen, dass die "Das ist ein Test"-bytes zurückgesendet werden,
selbst wenn danach der Server auf weitere Eingaben wartet

im Client dürften die dann in der Schleife ankommen, wobei danach ebenfalls gewartet wird ;)
kann jetzt aus Zeitmangel nicht mehr testen

-------

was wäre denn dein Wunsch, wann sollte das -1 kommen, nachdem "Das ist ein Test" empfangen wurde,
und zwar weil danach nichts mehr kommt?
wie lange soll der Server darauf warten dass nichts mehr kommt, gar nicht oder z.B. 1 sec?
wenn der Client nach etwas Pause noch was senden will ist der Server schon beim close()?
 
J

Jessy

Gast
Hallo Slater,

ich hatte zuvor Ausgaben in den Schleifen. Das Problem ist aber, dass keine der Schleifen jemals betreten wird. Sowohl Client auch als Server hängen im read() fest.
 

TKausL

Top Contributor
Java:
while((readByteCount = socket.getInputStream().read(bArr, 0, 1024)) != (-1)) bOut.write(bArr, 0, readByteCount);
			bOut.flush();

Hier ist dein Problem. Nur das "Write" ist IN deiner Schleife. Es ist also nicht sichergestellt, dass auch geflusht wird weil nach dem write direkt wieder gelesen wird.

Edit:
Java:
			while((readByteCount = socket.getInputStream().read(bArr, 0, 1024)) != (-1)) {
				bOut.write(bArr, 0, readByteCount);
			}

Dein Client hängt auch in der While. Beide warten nun ewig auf eine "Antwort" ohne dass irgendwann die Schleife abgebrochen wird.
 
S

SlaterB

Gast
der Server schreibt ja auch nicht direkt an den Client sondern wie der Client in einen ByteArrayOutputStream..
aber eine Log-Meldung bekomme ich beim Server zu sehen
Java:
			while((readByteCount = socket.getInputStream().read(bArr, 0, 1024)) != (-1)) {
				System.out.println("read "+readByteCount+" at server ");
				bOut.write(bArr, 0, readByteCount);
			}

insgesamt ist die Kommunikation freilich schwierig, so wie zwei Menschen am Telefon,
warten, ist der andere fertig, selber sprechen, auflegen?

mit Protokollen, etwa erst Anzahl Bytes vorher senden usw., gehts leichter

auch Web-Browser können hängen wenn manche Seiten ihre Bytes nicht schicken, Seitenaufbau dauert ewig oder klappt nie,
das ist nunmal so, die volle Kontrolle hat man nur wenn man im eigenen Arbeitsspeicher mit 5 int-Variablen jongliert

Timeout kann noch ein interessanter Konfigurationspunkt sein, wie lange warten
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C BufferedReader/BufferedWriter schreibt nicht alle Bytes Allgemeine Java-Themen 2
V Input/Output Austausch von Bytes zwischen C# und Java Allgemeine Java-Themen 3
RalleYTN Input/Output Clip als ein Array von Bytes? Allgemeine Java-Themen 2
J Temperatur aus bytes auslesen. Allgemeine Java-Themen 13
Q Bytes verschwinden im CipherInputStream Allgemeine Java-Themen 1
L Methoden Methode gibt mir beim verschlüsseln mit RSA 0 bytes aus ? Allgemeine Java-Themen 1
Q Datentypen Short aus Bytes - Signed -> Unsigned? Allgemeine Java-Themen 9
C Datentypen int in bytes zerlegen und wieder zusammen setzen Allgemeine Java-Themen 13
K Hexadezimale Bytes Allgemeine Java-Themen 6
B bereits gelesene Bytes herausfinden Allgemeine Java-Themen 10
M FIFO Queue: bytes in, float/double/etc out Allgemeine Java-Themen 5
S String zu binary und zurück - Problem mit unsigned/signed bytes Allgemeine Java-Themen 2
TiME-SPLiNTER Von Unix, InputStreams und Null Bytes Allgemeine Java-Themen 2
K AES, Buffer und Bytes Allgemeine Java-Themen 2
S Bytes oder Hex-Werte zu Assembler Code? Allgemeine Java-Themen 6
L bytes nach int (little endian bitshift) Allgemeine Java-Themen 12
J Receive eines Hex-Bytes über COM-Port Allgemeine Java-Themen 4
G Zwei bytes vergleichen Allgemeine Java-Themen 2
M Bytes in Datei schreiben Allgemeine Java-Themen 10
T Spezielle Bytes in Datei schreiben Allgemeine Java-Themen 7
F Einlesen von Bytes Allgemeine Java-Themen 9
reibi Größe Array aus bytes Allgemeine Java-Themen 14
G RXTX verschicken einzelener Bytes Allgemeine Java-Themen 8
G WAV-Samples bearbeiten oder: 2 Bytes -> short -> float Allgemeine Java-Themen 5
T Größe eine Variablen in Bytes? Allgemeine Java-Themen 22
G Mehrere Bytes auf einmal einlesen Allgemeine Java-Themen 4
P int -> 4 bytes Allgemeine Java-Themen 11
R Menge an Bytes eines OutputStreams ermitteln. Allgemeine Java-Themen 6
R Wieviele Bytes gesendet Allgemeine Java-Themen 3
T Bestimmte bytes in einer Datei ersetzen? Allgemeine Java-Themen 4
D 16-Bit int --> 2* 8-Bit Bytes Allgemeine Java-Themen 17
H Objekte verbrauchen immer mindestens 16 Bytes Allgemeine Java-Themen 3
W Array größer als 65536 Bytes Allgemeine Java-Themen 7
A RandomAccessFile - Bytes vom Anfang der Datei löschen Allgemeine Java-Themen 32
C Code of a method longer than 65535 bytes Allgemeine Java-Themen 3
L 8 bytes von bestimmter position weg lesen? Allgemeine Java-Themen 11
D 2 Bytes in ein int convertieren Allgemeine Java-Themen 2
B Umwandeln von Bytes in float Zahl (DataInputStream) Allgemeine Java-Themen 3
G 0 Bytes bei temporäre Datei. Warum? Allgemeine Java-Themen 6
W Socket.setSoTimeout -> BufferedReader -> Default value Allgemeine Java-Themen 4
F Einfaches Beispiel mit Netty Socket.IO Allgemeine Java-Themen 6
A ByteArray über Socket Allgemeine Java-Themen 3
Master3000 Java Port reset (Socket) Allgemeine Java-Themen 6
J socket closed - wie behandeln. Allgemeine Java-Themen 2
E Socket Java Socket Antwortet nicht. Allgemeine Java-Themen 2
J Could not convert socket to TLS - gestern liefs noch Allgemeine Java-Themen 2
Meeresgott Input/Output Java Socket Verbindung Allgemeine Java-Themen 1
D Socket Verbindung mit TLSv1 Allgemeine Java-Themen 1
C Input/Output Zip Files über Socket senden und empfangen Allgemeine Java-Themen 6
O Socket-Unterschiede zwischen Windows und Ubuntu Allgemeine Java-Themen 2
D Socket Java Socket Verbindung Allgemeine Java-Themen 14
T Serialisiertes Objekt über Socket nachladen Allgemeine Java-Themen 8
R Socket verbindung mit Timeout Allgemeine Java-Themen 2
N InputStreamReader-> DataInputStream-> Socket.getInputS Allgemeine Java-Themen 25
T Socket Server Anwendung - Empfang eines Byte-Arrays Allgemeine Java-Themen 7
G Java Socket langsam unter Linux Allgemeine Java-Themen 21
P Typ Object in socket umwandeln Allgemeine Java-Themen 4
T OO zum drucken/convertieren ohne Socket Allgemeine Java-Themen 8
F Socket - Server verbindung Allgemeine Java-Themen 12
T ObjectOutputStream => Socket versenden Allgemeine Java-Themen 2
A Socket-Server ohne Terminal laufen lassen [Windows] Allgemeine Java-Themen 5
R 11 GB File lesen ohne zu extrahieren Filedaten Bereich für Bereich adressieren dann mit Multi-Thread id die DB importieren Allgemeine Java-Themen 3
G Dateien lesen Allgemeine Java-Themen 3
OnDemand Excel lesen wie CSV Allgemeine Java-Themen 7
S Textdatei statt von Dateisystem aus .jar lesen Allgemeine Java-Themen 3
oskarS85 GeoTiff NDVI pixelweise lesen Allgemeine Java-Themen 2
R Lesen von Interfaces (Programm Vervollständigen) Allgemeine Java-Themen 10
OnDemand CSV lesen flexible Spalten Allgemeine Java-Themen 3
E Datentypen Wie kann ich die Längen der unterschiedlichen Ebenen aus einem Objekt lesen von dem ich weiß, dass es ein mehrdimensionaler Array ist? Allgemeine Java-Themen 3
S File lesen und schreiben Java 6 Allgemeine Java-Themen 2
J Die Letzte Zahl aus einer Text datei lesen Allgemeine Java-Themen 8
L Input/Output Kassenzettel lesen aus einem Bild Allgemeine Java-Themen 2
M Daten aus MatLab Datei lesen Allgemeine Java-Themen 8
G Excel Tabelle lesen und in neue Excel Tabelle einfügen Allgemeine Java-Themen 11
J File in Package erstellen & lesen mit Programmstart in externe Projekt Allgemeine Java-Themen 3
A File lesen Codierung Charset Allgemeine Java-Themen 5
E Socket Dynamische Klasse von ObjectOutputStream lesen. Allgemeine Java-Themen 8
D Mit Java PHP hashmap lesen Allgemeine Java-Themen 1
B Quellcode lesen - Aussortieren Allgemeine Java-Themen 3
A Steuerung von Spiel aus Datei lesen Allgemeine Java-Themen 0
F Best Practice Große Anzahl an Objekten speichern und lesen Allgemeine Java-Themen 19
L CSV File lesen, in ArrayList speichern und ausgeben Allgemeine Java-Themen 3
S Eigenschaften (hier Verknüpfung) eines Files lesen Allgemeine Java-Themen 2
OnDemand Java Barcode lesen Allgemeine Java-Themen 4
F Json in sql speichern und lesen Allgemeine Java-Themen 10
K Classpath Alle Classen aus einem Package lesen Allgemeine Java-Themen 7
X NetBeans Bilder und andere Dateien ins .jar schreiben und wieder aus .jar lesen Allgemeine Java-Themen 6
K Bestimmten Bereich eines Strings lesen Allgemeine Java-Themen 6
H Input/Output .txt Datei in Jar lesen Allgemeine Java-Themen 6
F Lesen effizienter als schreiben? Allgemeine Java-Themen 4
RalleYTN REST API ResponseType application/pdf lesen Allgemeine Java-Themen 0
R Inputstream lesen mit Pointer Allgemeine Java-Themen 0
I Setzen und Lesen eines Objektes (Enum?) Allgemeine Java-Themen 10
javampir Input/Output Effizienz beim binären Lesen einer Datei Allgemeine Java-Themen 6
D Datentyp von Unbounded Wildcards lesen Allgemeine Java-Themen 2
J Text lesen und in Variablen speichern Allgemeine Java-Themen 3
B SMS von Vodafone Mobile Connest mit JAVA-Programm lesen Allgemeine Java-Themen 0
2 String Array in Datei schreiben und wieder davon lesen Allgemeine Java-Themen 2
A In Excel-Datei schreiben, Formeln der Mappe anwenden, Wert lesen Allgemeine Java-Themen 3
Thallius Dateien Zippen und wieder heraus lesen? Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben