Input-/OutputStream Frage

H

hexxenhammer

Gast
Hallohallo Gemeinde,

bin sonst nicht so sehr in Foren unterwegs, aber ich bräuchte mal Hilfe bei einem Problem, das mir derzeit Kopfzerbrechen bereitet.
Und zwar handelt es sich um ein Chatprogramm auf Client/Server Basis, bei der Strings hin und her gesendet werden. Das funkioniert derzeit alles einwandfrei. Nun hab ich mir überlegt anstelle von Strings lieber Objekte zu schicken, da ich darin mehr Informationen transportieren kann (wie z.b. Schriftart/Farbe/etc...).

Der Client arbeitet wie folgt:

Er läuft in einer while Schleife und prüft ob es neue Nachrichten gibt.
Bisher war es so, dass ich dafür BufferedWriter bzw. BufferedReader benutzt habe.
Das hatte den Vorteil, dass ich immer abfragen konnte ob denn wirklich etwas im Bufferedreader drin steckt,
mit Hilfe von BufferedReader.ready().

was so aussieht:

Java:
input = new BufferedReader(new InputStreamReader(server.getInputStream()));
if (input.ready() == true) 
{
   ...
   String txt = input.readLine();
   ...
}


Wenn ich nun ObjectInputStream benutze hab ich leider keine solche Funktion. was dann so aussieht:
Java:
input = new BufferedInputStream(server.getInputStream());
Message tmp_msg = (Message) input.readObject();

Mein Client bleibt dann also einfach hängen bei der 2. Zeile und reagiert aber dementsprechend nicht mehr auf was anderes (wie senden zb). Gibt es eine Möglichkeit für ObjectInputStream ähnlich der .ready()-Funktion bei BufferedReader?

Wenn ja, wäre es nett, wenn ihr mir das mitteilen könntet.
Wenn nicht, hab ihr eine Idee, wie man das Abfragen auf ankommende Nachrichten(Objekte) anders gestalten könnte?
 

Murray

Top Contributor
Gibt es eine Möglichkeit für ObjectInputStream ähnlich der .ready()-Funktion bei BufferedReader?
Wie wäre es mit InputStreamavailable()? Damit hat man zwar keine Garantie, dass das Objekt bereits vollständig gelesen werden kann, aber das ist mit BufferedRead.ready ja ähnlich. In beiden Fällen bekommt man aber mit, dass der Server zumindest angefangen hat, Daten zu schreiben - insofern lohnt es sich, mit dem Lesen anzufangen.
 

Kr0e

Gesperrter Benutzer
Hmm, du musst mit Threads arbeiten. Socketprogrammierung ohne NIO funktioniert in Java nicht ohne Threads (Sofern du Sachen gleichzeitig bearbeiten willst).
Ich hab mal gehört die avaible() Methode muss nicht unbedingt auf jeder Plattform das richtige ausgeben.

Davon abgesehen hast du bei Objekten ein anderes Problem. Wenn du readObject() aufrufst, dann wird solange gelesen, bis das Objekt da ist. Wenn du nun mit avaiable überprüfst wieviel Daten da sind, weißt du immernoch nicht, bei welche Größe du dann endlich readObject aufrufen darfst, ohne dass die Methode blockiert...

Mach nen Thread der die ganze Zeit empfängt und ggf. schläft. Mach nen Handler, der, falls ein Objekt da ist, aufgerufen wird, danach geh wieder auf recv. Dein Programm wird dann nciht stocken, da nur der Lesethread blockiert...

Gruß,
Chris
 
Zuletzt bearbeitet:

ice-breaker

Top Contributor
Code:
available()
des InputStreams gibt immer 0 zurück, die Methode ist wahrscheinlich erst bei gebufferten Streams sinnvoll, die darüber ausgeben können, wieviele Bits im Buffer sind
 

Murray

Top Contributor
Code:
available()
des InputStreams gibt immer 0 zurück, die Methode ist wahrscheinlich erst bei gebufferten Streams sinnvoll, die darüber ausgeben können, wieviele Bits im Buffer sind
Das ist korrekt; er verwendet hier ja auch einen BufferedInputStream, mit dem es klappen sollte. Insofern war der Link auf die Doku der Basisklasse sicher etwas verwirrend.
 
S

SlaterB

Gast
wie soll der BufferedInputStream diese Information aus dem InputStream erhalten?
wenn man mal alte Daten im Puffer vom vorherigen Senden außer acht läßt, kann man doch auf diesen Weg nicht mitbekommen, 'dass der Server zumindest angefangen hat, Daten zu schreiben', oder?
man müsste erst ein read() ausführen, welches dann blockieren kann, falls der Server doch noch nichts gesendet hat

aber stimmt schon, was immer da vorher beim BufferedReader geklappt hat, müsste mit available() nun genauso funktionieren
 

Murray

Top Contributor
wie soll der BufferedInputStream diese Information aus dem InputStream erhalten?
wenn man mal alte Daten im Puffer vom vorherigen Senden außer acht läßt, kann man doch auf diesen Weg nicht mitbekommen, 'dass der Server zumindest angefangen hat, Daten zu schreiben', oder?
man müsste erst ein read() ausführen, welches dann blockieren kann, falls der Server doch noch nichts gesendet hat
Stimmt, Asche auf mein Haupt, da hast du natürlich Recht - über available bekommt man bestenfalls mit, wenn bei vorhergehenden Read-Operationen bereits weitere Daten in den Buffer gepackt worden sind. Von selbst (also ohne eine ggfs. blockierende Read-Operation) wird sich der Buffer nicht füllen. Insofern ist es hier sinnlos, per available prüfen zu wollen, ob neue Daten vorliegen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Filter für Input UND OutputStream Netzwerkprogrammierung 4
L Server-Socket liest Input-Stream nicht Netzwerkprogrammierung 5
M Socket kein Input Netzwerkprogrammierung 8
P Socket Socket-Verbindung Input sehr langsam Netzwerkprogrammierung 1
T ServerSocket bleibt beim lesen von Input hängen Netzwerkprogrammierung 2
lacyuu Warum empfängt mein Stream keinen Input? Netzwerkprogrammierung 4
P Probleme mit Input- / Output-Streams Netzwerkprogrammierung 2
D Habe 2 Probleme: Input eingabe und Multi Socket Server Netzwerkprogrammierung 2
C IRC CHAT auslesen -> Sockets/input und output Streams Netzwerkprogrammierung 9
T OutputStream kommt nicht an Netzwerkprogrammierung 18
L Socket Wie kann ich checken ob ein User eine Nachricht per Outputstream an den Server gesendet hat? Netzwerkprogrammierung 1
S FTP OutputStream Timed out Netzwerkprogrammierung 2
D Socket Socket OutputStream leeren? Netzwerkprogrammierung 3
Seikuassi Socket CipherInput/OutputStream empfängt nichts Netzwerkprogrammierung 23
C Inhalt einer .JPG Datei in einen OutputStream schreiben? Netzwerkprogrammierung 10
E Socket Outputstream - chunks groeße bestimmen. Netzwerkprogrammierung 3
T Socket ObjectIn/OutputStream Netzwerkprogrammierung 3
A Socket BufferedReader.readLine() blockiert bis ein im Socket OutputStream was gesendet wird ... Netzwerkprogrammierung 9
M Socket InputStream sendet ausgaben von OutputStream zurück Netzwerkprogrammierung 2
D Inputstream to Outputstream Netzwerkprogrammierung 3
T Outputstream Byte-Array senden Netzwerkprogrammierung 2
O Mehrere Datei per DataInput/OutputStream über Socket Netzwerkprogrammierung 12
P Probleme mit OutputStream Netzwerkprogrammierung 7
M Verbindung über Proxy// Problem mit Outputstream bei URLConn Netzwerkprogrammierung 5
PAX Outputstream von anderem Thread verwenden lassen Netzwerkprogrammierung 5
Y Inhalt aus Textfield in OutputStream packen Netzwerkprogrammierung 4
bummerland Cookies über OutputStream senden Netzwerkprogrammierung 2
J Frage zum Keystore Netzwerkprogrammierung 21
E Socket Frage Netzwerkprogrammierung 6
T Frage bzgl. Socket-API Netzwerkprogrammierung 1
C Jetty 9 Non Blocking Handler Frage... Netzwerkprogrammierung 1
O log4j Appender Frage Netzwerkprogrammierung 6
T Frage zu Client-Server Applikation Netzwerkprogrammierung 2
M Theoretische Frage zu Server - Client Netzwerkprogrammierung 2
C Frage zu Threads & Server Netzwerkprogrammierung 4
P Eine etwas andere Frage: Sicherheit Netzwerkprogrammierung 5
M allgemeine Frage über Server-Client-Kommunikation Netzwerkprogrammierung 5
M allgemeine Frage zu einem Web Service Client Netzwerkprogrammierung 2
Q Frage zur Socketprogrammierung Netzwerkprogrammierung 12
D HTTP Frage zu Login & Session ID Netzwerkprogrammierung 5
D HTTP nochne frage zu http requests Netzwerkprogrammierung 6
D "Fileserver" Frage + Mit Java zugreifen Netzwerkprogrammierung 9
S Socket-Frage zu einem LAN-Spiel. Netzwerkprogrammierung 3
Helgon Socket Socket IP Frage + Tutorial/Bücher Netzwerkprogrammierung 5
C Webservice Frage Netzwerkprogrammierung 2
M RMI Code Frage: Netzwerkprogrammierung 4
C Frage zur Klasse DatagramPacket Netzwerkprogrammierung 2
S Einfache Server Frage Netzwerkprogrammierung 5
xDarkSunx Kleine Frage authentifizierung Netzwerkprogrammierung 13
G Frage zu Servlets und deren Objekte + Bilder in Servlets anzeigen? Netzwerkprogrammierung 11
N Frage zu JNDI Netzwerkprogrammierung 2
B Frage zu einer Lösung (RMI) Netzwerkprogrammierung 2
X FAQ Frage - Netzwerkgrundlagen - ServerSocket und Socket Netzwerkprogrammierung 4
G Netzwerk IP Frage Netzwerkprogrammierung 4
S NanoHTTPD Server frage Netzwerkprogrammierung 5
E einfache Frage: wie Fehler untersuchen mit Tomcat Netzwerkprogrammierung 5
E Einfache Frage zu servlets und netbeans 6.5 Netzwerkprogrammierung 41
N Frage/Problem mit RMI Netzwerkprogrammierung 3
Kr0e Frage zu SO_TIMEOUT Netzwerkprogrammierung 3
K SCP und die Frage: Wie geh ich damit um? Netzwerkprogrammierung 7
K Frage zum Verhalten von SocketChannel.write(.) Netzwerkprogrammierung 9
G Frage zu Serversocket-Beispiel aus der FAQ Netzwerkprogrammierung 17
A Frage zur Verschlüsselung mit CipherInputStream Netzwerkprogrammierung 7
H Frage zu RMI Netzwerkprogrammierung 4
5 Grundlegende Design-Frage zu Webservices Netzwerkprogrammierung 16
C Frage zur ipcam WVC54GC von linksys ? Netzwerkprogrammierung 1
ven000m Mittlere Wartezeit Frage Netzwerkprogrammierung 5
T Frage bei Irc Verbindung Netzwerkprogrammierung 10
ven000m Frage aus einer mündl. Prüfung - wer kennt die Antwort? Netzwerkprogrammierung 6
S Serveranfrage - allgemeine Frage Netzwerkprogrammierung 2
ven000m Thread Frage Netzwerkprogrammierung 11
D Frage: Buffered Reader --> Wie komm ich an die Daten (Byt Netzwerkprogrammierung 3
H Frage zur Performance Netzwerkprogrammierung 10
flashfactor Frage zu HTML-Response Netzwerkprogrammierung 4
S GEHT DAS? - Nur eine Frage! (Printer Port direkt ansteuern?) Netzwerkprogrammierung 4
K Frage zu Net Send Netzwerkprogrammierung 7
G Frage zu JNDI / RMI Netzwerkprogrammierung 4
A ServerSocket prinzipielle Frage Netzwerkprogrammierung 5
M generelle Frage zum Versenden Netzwerkprogrammierung 4
L Frage nach Socket Netzwerkprogrammierung 4
E frage zu streams Netzwerkprogrammierung 2
Luma Verschiedene Frage zu nem Netzwerkprog Netzwerkprogrammierung 6
G einfache Frage zu ServerSocket ... Netzwerkprogrammierung 5

Ähnliche Java Themen


Oben