"Ende eines Sockets"

Status
Nicht offen für weitere Antworten.
K

Kinimod

Gast
Hi Leute,

habe nur mal kurz ne definitionsfrage.
und zwar wenn ich als client mithilfe eines InputStream-Objekts und der zugehörigen Methode read(byte[] b) den OutputStream eines Servers abhorche, dann gibt mir read ja solange die anzahl der gelesenen bytes aus, bis laut definition "das ende des streams" erreicht ist.
aber was genau ist dieses "ende des streams" ?

kurzer code, damit ihr auch verstehen könnt, warum ich die frage stelle (ausschnitt aus dem client-code):

Code:
String message=null;
try {
    int length;
    byte[] buffer=new byte[4096];
    message="";
    while((length=in.read(buffer))!=-1) 
        message=message+new String(buffer, 0, length);
    return message;
}
catch(Exception e) {
    return message;
}


so, nun ist der server allerdings so strukturiert, dass er permanent mit dem client verbunden ist, d.h. jederzeit der OutputStream zum Clienten offen ist.
Mein Anliegen ist es nun, dass der Server irgendwas sendet, der client empfängt es mithilfe des oben dargestellten codes und springt auch anschließend aus der schleife raus, und bleibt nicht in der whileschleife hängen und wartet einfach auf weiteren input ^^.
und genau hier steckt mein problem, denn obwohl an sich ja keine daten vom server mehr kommen, wartet die methode read ja auf weitere und blockiert den prozess ...

habe das ganze jetzt mittels socket.setSoTimeout() gelöst, allerdings finde ich das irgendwie unelegant und hoffe, dass mich eine genaue definition von "ende des streams" weiterbringt.



Vielen dank schonmal im voraus an alle


Dominik
 
T

tuxedo

Gast
ende des streams = -1 available bytes
bzw.
eine SocketClosedException oder eine IOException.

Wenn die Kommunikation vom Server zum Client beendet ist, kannst du entweder auf Serverseite oder auf Clientseite ein .close() auf dem Socket machen. Dann ist auch das Ende des Streams erreicht.

- Alex
 
K

Kinimod

Gast
Danke erstmal für die antwort.
gibt es denn mit dem normalen InputStream irgendeine möglichkeit zu überprüfen, ob noch bytes im stream drin sind ?
weil available gibt hier ja immer nur 0 zurück ....
 
K

Kinimod

Gast
oder ich schau einfach mal ob nicht in.read()==0 zum ergebnis führt, ist mir 2 sekunden nach erstellung des vorigen posts eingefallen ^^
 
K

Kinimod

Gast
nein das geht ja leider nicht, weil ja immer der letzte ausgelesene wert von length gespeichert bleibt ...
also bitte lösungsvorschläge, verzweifle hier schon voll :(
 
T

tuxedo

Gast
wenn availavle() nur 0 zurück liefert, liegt das schlicht und einfach daran, dass es nix zum lesen gibt. Das funktioniert bei mir bisher 100,00% zuverlässig.

Wenn du das Ende des Streams ermitteln willst, warte auf eine Exception die bei einem read-vorgang auftritt bzw schau was available() zurückgibt.

Mehr gibts dazu nicht zu sagen. Und mehr Lösungswege sind mir auch nicht bekannt.

- Alex
 
K

Kinimod

Gast
alex0801 hat gesagt.:
wenn availavle() nur 0 zurück liefert, liegt das schlicht und einfach daran, dass es nix zum lesen gibt. Das funktioniert bei mir bisher 100,00% zuverlässig.

Wenn du das Ende des Streams ermitteln willst, warte auf eine Exception die bei einem read-vorgang auftritt bzw schau was available() zurückgibt.

Mehr gibts dazu nicht zu sagen. Und mehr Lösungswege sind mir auch nicht bekannt.

- Alex


das ist so wie du das sagst laut der java-API nicht korrekt.

available

public int available()
throws IOException

Returns the number of bytes that can be read (or skipped over) from this input stream without blocking by the next caller of a method for this input stream. The next caller might be the same thread or another thread.

The available method for class InputStream always returns 0.

This method should be overridden by subclasses.

Returns:
the number of bytes that can be read from this input stream without blocking.
Throws:
IOException - if an I/O error occurs.


habe das worauf es mir ankommt nochmal rot hervorgehoben. das verdeutlicht, dass mein problem nicht mit available gelöst werden kann ...


Gibt es vielleicht noch andere vorschläge ?
 
T

tuxedo

Gast
Gut, irren ist menschlich. Aber statt drauf rum zu reiten: Wieso suchst du nicht gleich weiter in der API-Doc? Okay, was heisst suchen. Du hättest nur selbst die Augen etwas weiter aufmachen müssen, dann wärst du nämlich hier drauf gestoßen:

http://java.sun.com/javase/6/docs/api/java/io/InputStream.html#read() hat gesagt.:
read

public abstract int read()
throws IOException

Reads the next byte of data from the input stream. The value byte is returned as an int in the range 0 to 255. If no byte is available because the end of the stream has been reached, the value -1 is returned. This method blocks until input data is available, the end of the stream is detected, or an exception is thrown.

A subclass must provide an implementation of this method.

Returns:
the next byte of data, or -1 if the end of the stream is reached.

Throws:
IOException - if an I/O error occurs.

Das selbe findest du bei allen read-Methoden von InputStream.

Im Zweifelsfall wirst du noch rechtzeitig eine Exception bekommen. Aber das hab ich ja glaub auch schon mehrfach erwähnt.
 
K

Kinimod

Gast
alex0801 hat gesagt.:
Gut, irren ist menschlich. Aber statt drauf rum zu reiten: Wieso suchst du nicht gleich weiter in der API-Doc? Okay, was heisst suchen. Du hättest nur selbst die Augen etwas weiter aufmachen müssen, dann wärst du nämlich hier drauf gestoßen:

http://java.sun.com/javase/6/docs/api/java/io/InputStream.html#read() hat gesagt.:
read

public abstract int read()
throws IOException

Reads the next byte of data from the input stream. The value byte is returned as an int in the range 0 to 255. If no byte is available because the end of the stream has been reached, the value -1 is returned. This method blocks until input data is available, the end of the stream is detected, or an exception is thrown.

A subclass must provide an implementation of this method.

Returns:
the next byte of data, or -1 if the end of the stream is reached.

Throws:
IOException - if an I/O error occurs.

Das selbe findest du bei allen read-Methoden von InputStream.

Im Zweifelsfall wirst du noch rechtzeitig eine Exception bekommen. Aber das hab ich ja glaub auch schon mehrfach erwähnt.


ja das read bei dem end of stream -1 zurück gibt war mir ja klar, nur mein problem ist halt, dass der gegensocket überhaupt nicht geschlossen wird, sondern die verbindung weiterhin bestehen bleibt, was wiederum bedeutet, dass der fall "end of socket" überhaupt nicht eintritt.
mir geht es einfach nur darum eine möglichkeit zu finden, mithilfe derer ich überprüfen kann, ob MOMENTAN noch bytes im stream vorhanden sind.
und bisher bin ich halt auf keine brauchbare funktion oder methode in der api gestoßen ...

und falls es dir so erschienen ist, dass ich auf deinem "fehler" rumreite, dann kann ich nur sagen, dass es von mir überhaupt nicht so gemeint war. ich wollte lediglich auf die tatsache hinweisen, dass diese lösung wie von dir vorgeschlagen (leider) nicht funktioniert.
falls es anders rübergekommen ist, möchte ich mich für das missverständnis und meinen evt. unangebrachten "tonfall" entschuldigen.


Dominik
 
T

tuxedo

Gast
Hast du das mit dem -1 mal ausprobiert?

Auf was willst du eigentlich hinaus?
Du schreibst du willst den OutputStream am Server "permanent" zum Client offen halten. Solange der OutputStream aber offen ist, wird NIE das Ende des Streams erreich.

Machst du ein close() auf den OutputStream fliegt dir am Client der "End of Stream" bzw. eine Exception um die Ohren, die besagt "stream closed".

Solange du also am Server den Stream nicht "beendest", kriegt der Client auch kein End of Stream.

Stream heisst ja so viel wie Strom. Stell dir also einen Wasserstrom vom Server zum Client vor. Da fließt die ganze Zeit Wasser ... ununterbrochen. Wenn du was auf den Strom "draufschreibst" gleich das einer Flaschenpost die du am Server in den Fluss wirfst und am Client wieder rausfischst.

Was du jetzt versuchst ist, am Server dem Fluss NICHT den Hahn zuzudrehen, und am Client trotzdem ein "Hey, da kommt kein Wasser mehr" festzustellen. Das geht halt einfach nicht.

Mach den Strom am Server dicht, dann kriegt das der Client auch entsprechend mit. Fertig.

Hoffe ich konnte die Sache etwas "aufhellen".

- Alex
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
1 SSH-Kommunikation - Ende eines Streams nicht erkenntlich Netzwerkprogrammierung 2
K Ende eines HTTP Response/Request Netzwerkprogrammierung 6
U Ende eines Inputstreams ermitteln Netzwerkprogrammierung 3
M Socket, Ende Dateitransfer Netzwerkprogrammierung 4
G Sockets und HTTP: Ende des Datenempfangs erkennen Netzwerkprogrammierung 3
m@nu Ende von Stream bei HTTP-Request Netzwerkprogrammierung 3
M Ende des Streams ohne Schließen/Checksumme mitsenden Netzwerkprogrammierung 2
D Timeouts ohne Ende bei SMTP und FTP Netzwerkprogrammierung 3
M SocketError bei Aufruf eines SOAP-Servers Netzwerkprogrammierung 8
G seite nach posten eines html-forms laden Netzwerkprogrammierung 0
J Protokolle innerhalb eines Heimnetzwerks Netzwerkprogrammierung 6
V Kann man mit Hilfe eines Java-Programms den Zugriff auf bestimmte Internetseiten verhinden? Netzwerkprogrammierung 3
N Name eines Attributes aus einem festen String und einer Variablen generieren Netzwerkprogrammierung 5
X Response eines RESTful-Service mit JSON Netzwerkprogrammierung 8
F Neuer Json aus teilen eines vorhandenen Json Netzwerkprogrammierung 0
N Client Identifikation eines Servers Netzwerkprogrammierung 1
R Problem beim Programmieren eines Chatprogramms Netzwerkprogrammierung 5
K Multiplayer eines Spiels Netzwerkprogrammierung 21
K Ansprechen eines Remote Druckers Netzwerkprogrammierung 2
L Erstellen eines Online Multiplayer Apps Netzwerkprogrammierung 10
eLogic Download eines Links Netzwerkprogrammierung 2
U Socket Abhören eines Sockets/Ports in extra Thread Netzwerkprogrammierung 8
2 Schliessen eines Serversockets Netzwerkprogrammierung 2
Hindi93 Abbruch eines Programmes abfangen Netzwerkprogrammierung 8
C Alle Computer eines Netzwerkes finden Netzwerkprogrammierung 32
N Senden eines Arrays Netzwerkprogrammierung 6
U Name eines Netzlaufwerks ermitteln Netzwerkprogrammierung 5
L Body eines http Request auslesen Netzwerkprogrammierung 2
aze Tcp Verkehr eines Applets simulieren Netzwerkprogrammierung 10
J Socket Erreichbarkeit eines Java Servers (Socket-Lösung) über das Internet Netzwerkprogrammierung 3
M Socket Leistungsfähigkeit eines xSocketservers, wieviele Verbindungen max? Netzwerkprogrammierung 4
clupus Exception beim Schließen eines Sockets Netzwerkprogrammierung 6
cowabunga1984 Transferierte Datenmenge eines SOAP Clients (JAX-WS) anzeigen Netzwerkprogrammierung 2
K TrafficClass eines UDP Pakets kommt beim Empfänger nicht an Netzwerkprogrammierung 5
musiKk Problem bei bidirektionaler Nutzung eines Socket Netzwerkprogrammierung 2
J Machbarkeit eines Bluetooth-Servers? Netzwerkprogrammierung 2
S Realisierung eines Netzwerkcodes für ein Strategiespiel Netzwerkprogrammierung 7
A Broadcast - senden eines Packetes an alle rechner im netz Netzwerkprogrammierung 15
P problem beim schließen eines Streams Netzwerkprogrammierung 6
K Mit Java-MailAPI dir Verfügbarkeit eines SMTP-Servers prüfen Netzwerkprogrammierung 4
J while-Schleife / Abbruchbed. beim Einlesen eines Streams Netzwerkprogrammierung 4
J Länge eines Streams Netzwerkprogrammierung 4
T Timeout eines KSOAP-Calls Netzwerkprogrammierung 5
G Info eines Webseites kopieren Netzwerkprogrammierung 16
J Antwort eines Soaprequests parsen mittels org.apache.soap Netzwerkprogrammierung 2
E Möglichkeit zum Timeout eines Process Netzwerkprogrammierung 7
T Erstellung eines Proxy Netzwerkprogrammierung 11
T Pfad eines Servlets rausfinden Netzwerkprogrammierung 2
O Einbinden eines java-servers Netzwerkprogrammierung 9
C Übergabe eines Datensatzes (Übergabestruktur) Netzwerkprogrammierung 12
G Verzeichnis eines Rechners übers Netzwerk auslesen Netzwerkprogrammierung 5
B Problem mit der Ausgabe eines Strings an SocketOut Netzwerkprogrammierung 4
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
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
Q Thread und Sockets... Netzwerkprogrammierung 2
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
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
M Sockets und InputStream Netzwerkprogrammierung 8
G Verbindung über Sockets Netzwerkprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben