Vom Socket lesen wenn das Gegenüber schon disconnected ist?

Status
Nicht offen für weitere Antworten.
Hallo zusammen

Seit gestern beschäftige ich mich mit Netzwerksockets. Kann es sein, dass auf die API-Dokumentation nicht viel Verlass ist?

Dort steht zu BufferedReader.readLine(): "returns a String containing the contents of the line, not including any line-termination characters, or null if the end of the stream has been reached. Throws: IOException - If an I/O error occurs". Oder zu InputStreamReader.read(): "returns the character read, or -1 if the end of the stream has been reached".

Was meinen die mit "end of stream"? Dass nichts mehr kommt, also Ende Fahnenstange ist doch erst gewiss wenn der Stream geschlossen wurde. Blos dann bekomme ich ja sowieso eine IOException oder wenn das Gegenüber die Netzwerkverbindung geschlossen hat auch eine SocketException. Widerspricht sich das nicht?

Mir sind da einige SMTP- und FTP-Server bekannt die bei Verbindungsherstellung nur kurz eine Busy-Meldung auswerfen und die Verbindung sofort wieder kappen. Die kann ich aber gar nicht erst lesen weil jeder read sofort von einer Exception beantwortet wird. Muß ich da andere Methoden verwenden um noch an die Meldung zu kommen?

Robert
 
S

SlaterB

Gast
wenn diese Reader auf eine Datei angewendet werden, kann man auf jeden Fall bis null/-1 lesen,
dort gibts keinen vorzeitigen Abbruch, insofern macht die JavaDoc-Beschreibung schon Sinn,

bei Sockets vermute ich auch manchmal, dass dort die Verbindungen vielleicht beendet werden, bevor alle Daten gelesen wurden,
ob dem so ist kann ich mangels Erfahrung nicht sagen,
falls es für mich irgendwan mal wichtig wäre, würde ich es testen und dann wissen ;)

deine Argumentation, dass es dann bei Servern, die ihr Verhalten nicht großzügig anpassen, zu Problemen kommen kann, kann ich nachvollziehen,
aber auch nicht beantworten ;)

ich wollt nur das zu den FileReadern erwähnen
 
G

Gast2

Gast
Moin,

Kalter Kaffee hat gesagt.:
Mir sind da einige SMTP- und FTP-Server bekannt die bei Verbindungsherstellung nur kurz eine Busy-Meldung auswerfen und die Verbindung sofort wieder kappen. Die kann ich aber gar nicht erst lesen weil jeder read sofort von einer Exception beantwortet wird. Muß ich da andere Methoden verwenden um noch an die Meldung zu kommen?

Du machst was falsch ... Du bekommst die BUSY-Meldung und der Socket wird vom Server geschlossen ... in dem Moment erhälst Du auch eine -1 beim Lesen (oder null)

entweder Du liest die BUSY-Meldung falsch vom Netzwerk (also bereits zuviele Bytes) oder Du liest nach dem Schließen des Sockets noch was vom Netzwerk ... beides endet in einer Exception

hand, mogel
 
mogel hat gesagt.:
Kalter Kaffee hat gesagt.:
Mir sind da einige SMTP- und FTP-Server bekannt die bei Verbindungsherstellung nur kurz eine Busy-Meldung auswerfen und die Verbindung sofort wieder kappen. Die kann ich aber gar nicht erst lesen weil jeder read sofort von einer Exception beantwortet wird. Muß ich da andere Methoden verwenden um noch an die Meldung zu kommen?

Du machst was falsch ... Du bekommst die BUSY-Meldung und der Socket wird vom Server geschlossen ... in dem Moment erhälst Du auch eine -1 beim Lesen (oder null)

entweder Du liest die BUSY-Meldung falsch vom Netzwerk (also bereits zuviele Bytes) oder Du liest nach dem Schließen des Sockets noch was vom Netzwerk ... beides endet in einer Exception
Danke für eure Rückmeldungen. Ich glaube schon dass ich was falsch mache. Ich müsste nur rauskriegen wo.

Hat jetzt etwas gebraucht, aber inzwischen habe ich es etwas mehr getestet.
Bei einem kleinen Programm das in einem Thread einen ServerSocket aufmacht, ein paar Zeilen sendet und dann den Socket schließt funkioniert es wie es sollte. Der Client im Mainthread liest (nach einem sleep damit die Verbindung auch sicher schon zu ist) die Zeilen ein und erhält dann null vom nächsten readLine().

Sind es zwei getrennte Programme und ich starte den Serverteil, unterbreche dieses laufende Programm nach einer Zeile mittels Ctrl+C auf der Console, erhält der Client eine SocketException: Connection reset.

Wie denn das? Wo ist der Unterschied?

Robert
 

Ebenius

Top Contributor
Im ersten Beispiel wird die Socketverbindung geschlossen. Im zweiten Beispiel wird sie unterbrochen. Es ist doch ein Unterschied, ob sich Dein Kollege verabschiedet und nach hause geht, oder kommentarlos aus dem Fenster springt.
 
S

SlaterB

Gast
kommentarlos könnte man ja auch eher als 'läuft ewig weiter' interpretieren,
sendet das Betriebssystem irgendein Abbruchsignal oder werden bestimmte Kontrollnachrichten nicht mehr gesendet/ beantwortet?
 

Ebenius

Top Contributor
SlaterB hat gesagt.:
kommentarlos könnte man ja auch eher als 'läuft ewig weiter' interpretieren,
sendet das Betriebssystem irgendein Abbruchsignal oder werden bestimmte Kontrollnachrichten nicht mehr gesendet/ beantwortet?
Dein Betriebsystem bekommt von dem Sterben des Programms auf der gegenüberliegenden Seite nichts mit. Es schmeißt einen Fehler, beim nächsten Versuch.
 
Ebenius hat gesagt.:
SlaterB hat gesagt.:
kommentarlos könnte man ja auch eher als 'läuft ewig weiter' interpretieren,
sendet das Betriebssystem irgendein Abbruchsignal oder werden bestimmte Kontrollnachrichten nicht mehr gesendet/ beantwortet?
Dein Betriebsystem bekommt von dem Sterben des Programms auf der gegenüberliegenden Seite nichts mit. Es schmeißt einen Fehler, beim nächsten Versuch.
Naja, wenn das System auf der anderen Seite einfach abschmiert kann ich das verstehen.

Aber sollte das System beim Beenden eines lokalen Programms mit Ctrl+C nicht doch was mitkriegen? Darum ging es mir zwar nicht (sondern ums Schließen der TCP-Verbindung per FIN worauf mein Programm auch angemessen reagiert), aber verstehen möchte ich es doch gerne.

Mit Wireshark habe ich die Unterschiede auf TCP-Ebene noch nicht feststellen können da das unter Windows leider den Loopback nicht beschnüffeln kann.

Robert
 
T

tuxedo

Gast
Wenn die Anwendung abschmiert, kriegt das OS das mit und schließt auch die Socketverbindung, bzw. signalisiert ein FIN oder sowas.

Anderes Szenario:

PC 1 <-----> Switch A <----> Switch B <---> Switch C <---> PC 2

Fällt Switch B aus, kriegt das weder PC1 noch PC2 mit. Da muss man dann schon "KeepAlive" einschalten, oder noch besser regelmäßig ein "Ping-Pong" zwischen PC1 und PC2 betreiben. Und wenn auf eine "Ping" Nachricht in einem vorgegebenen Zeitfenster kein "Pong" eintrifft, wird die Verbindung wohl gestört sein.

Hab ich bei meiner SIMON Implementierung auch gebraucht. Drauf gekommen bi nich dadurch:

http://mindprod.com/jgloss/socket.html#DISCONNECT

Gruß
Alex
 
G

Gast2

Gast
Moin,

tuxedo hat gesagt.:
PC 1 <-----> Switch A <----> Switch B <---> Switch C <---> PC 2
da reicht schon die kurze Variante mit einem Switch ... selbst da kann man die Kabel ziehen und wieder stecken ... anschließend funktioniert die Verbindung immer noch - außer es wurde wärend der gezogenen Kabel versucht was zu senden ... dachte eigentlich bisher immer das das .NET-Framework Probleme macht ... liegt aber wohl am TCP Protokoll :)

Da muss man dann schon "KeepAlive" einschalten,
meinst Du setKeepAlive(true) ... ist das was internes von Java oder eine TCP-Implementierung?

oder noch besser regelmäßig ein "Ping-Pong" zwischen PC1 und PC2 betreiben.
idealerweise sendet der Client dieses Paket regelmäßig und der Server reagiert nur darauf mit einer Antwort ... reduziert die Server-Last

hand, mogel
 
T

tuxedo

Gast
Jepp das ist das mit setKeepAlive(true). Und ja, das ist eine In TCP eingebaute Funktion. Du musst da selbst nix dran drehen oder an deinem Protokoll ändern.

Da du aber keinen Einfluss darauf hast wann und wie oft TCP diese keepalive Pakete sendet kannst du das auch in dein Protokoll einbauen. Ich verwende das MINA Framework. Da hast du einen eingebauten Idle-Timer. Wenn die Verbindung eine gewisse Zeit brach liegt senden beide Seiten ein Pingpaket und starten einen Countdown. Kommt in dieser Zeit kein Pongpaket ist die Verbindung weg, oder die Gegenseite hängt fest.

Finde die Lösung besser als die Sache mit dem TCP KeepAlive da man da sicher gehen kann dass die Gegenseite noch arbeitet.

Gruß Alex
 
G

Gast2

Gast
Moin,

tuxedo hat gesagt.:
Jepp das ist das mit setKeepAlive(true). Und ja, das ist eine In TCP eingebaute Funktion. Du musst da selbst nix dran drehen oder an deinem Protokoll ändern.

ich habe es jetzt auch im .NET Framework gefunden ... ist ganz schön versteckt gewesen ... werde aber beim wohl Ping-Pong bleiben

hand, mogel
 
Jetzt bin ich gerade wieder über eine neue Variante des Problems gestolpert.

Ich habe ja das oben erwähnte kleine Testprogramm. Das wenn das einfach vom Socket liest der schon zu ist, kommt der vorher erhaltene Text noch an. Wurde jedoch nach schließen durch die andere Seite aber vor dem Lesen noch etwas gesendet (was selbst keinen Fehler aufwirft), wird ein read() mit
Code:
Exception in thread "main" java.net.SocketException: Software caused connection abort: recv failed
	at java.net.SocketInputStream.socketRead0(Native Method)
	at java.net.SocketInputStream.read(SocketInputStream.java:129)
	at java.net.SocketInputStream.read(SocketInputStream.java:182)
        ...
beantwortet.

Toll, ich kann doch nicht vor jedem write testen ob in der Zwischenzeit eine Nachricht reinkam. Denn wenn nicht, blockt der read ist.

Wie soll man denn mit so einem inkonsistenten Verhalten umgehen?

Robert
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Socket Server -> lesen von / schreiben zu php-script Netzwerkprogrammierung 6
B Versuch mit Socket etwas zu lesen und zu schreiben Netzwerkprogrammierung 15
Z Kann nicht Daten vom Server lesen Socket Netzwerkprogrammierung 10
C Datei über Socket schreiben und Ereignis lesen Netzwerkprogrammierung 9
C Socket Probleme beim Lesen und Schreiben aus/in einen Socket Netzwerkprogrammierung 2
S Thread, Daten vom Socket lesen Netzwerkprogrammierung 2
Z File über Socket lesen Netzwerkprogrammierung 3
Y Problem mit ObjectInputStream beim lesen vom Socket Netzwerkprogrammierung 10
S socket aus hashmap lesen -> geschlossen Netzwerkprogrammierung 2
G Socket Socket Kommunikation Netzwerkprogrammierung 1
L Server-Socket liest Input-Stream nicht Netzwerkprogrammierung 5
H Socket Kann ein Socket server 2 dimensionale Arrays empfangen und versenden? Netzwerkprogrammierung 3
D Socket-Verbindungen übers Internet Netzwerkprogrammierung 4
N Java socket Programmierung Filme verschicken Netzwerkprogrammierung 20
A TCP multiClientServer mit socket mittels ObjectOutputStream Netzwerkprogrammierung 12
A Socket-Anwendung (BufferedWriter/Reader liest nicht aktuellen Wert) Netzwerkprogrammierung 6
platofan23 Socket Java Socket mit DynDns nicht erreichbar Netzwerkprogrammierung 6
S Socket Bilder über Socket Senden Netzwerkprogrammierung 0
M Socket Socket lehnt Verbindung ab Netzwerkprogrammierung 3
x46 Connection reset by peer: socket write error Netzwerkprogrammierung 6
x46 Socket Files per Socket verschicken Netzwerkprogrammierung 1
platofan23 Probleme mit Socket bei Android Studio? Netzwerkprogrammierung 22
platofan23 Socket Hilfe mit Socket Thread und ArrayList Netzwerkprogrammierung 6
R Socket FATAL EXCEPTION MAIN bei Socket based client/server app Netzwerkprogrammierung 2
D new ObjectInputStream(socket.getInputStream()); Netzwerkprogrammierung 15
E Socket Frage Netzwerkprogrammierung 6
D ServerSocket - Socket Verbindungsart Netzwerkprogrammierung 3
T Frage bzgl. Socket-API Netzwerkprogrammierung 1
F TCP Socket auf Verbindungsabbruch prüfen Netzwerkprogrammierung 15
F Socket Verbindung mit Verschlüsselung und Authentifierzung Netzwerkprogrammierung 1
I Socket ObjectOutputStream-Socket: Objekt wird falsch übertragen Netzwerkprogrammierung 2
T Socket Socket connections schließen? Netzwerkprogrammierung 2
D Socket Socket OutputStream leeren? Netzwerkprogrammierung 3
T Socket Java Programm hängt sich auf bei dem versuch von einem Socket scanner Daten zu erhalten. Netzwerkprogrammierung 1
F Socket Socket in anderen Methoden Netzwerkprogrammierung 1
D Socket Run Args Client/Server Socket Netzwerkprogrammierung 1
M Problem bei Socket (MultiplayerSpiel) Netzwerkprogrammierung 4
I Socket Netzwerkprogrammierung 1
F Wiederverbinden nach socket Abbruch Netzwerkprogrammierung 1
J 1 Socket - 2 Serversocket Netzwerkprogrammierung 4
T Socket sendet erst nach socket.close() Netzwerkprogrammierung 2
F Socket Verbindungsaufbau abbrechen Netzwerkprogrammierung 3
P Socket Socket-Verbindung Input sehr langsam Netzwerkprogrammierung 1
I Socket Kommunikation C / Java Netzwerkprogrammierung 2
Joew0815 socket event handler Netzwerkprogrammierung 2
F Einfache Socket Verbindung Netzwerkprogrammierung 2
A Socket Socket Receive-/SendBuffersize Netzwerkprogrammierung 0
D Socket server auf Smartphone Netzwerkprogrammierung 9
H Socket Client/Server Socket Programmieren Netzwerkprogrammierung 1
A Socket Socket Server netcat Netzwerkprogrammierung 1
Shams Anfängerfrage zu Server-Socket-Kommunikation Netzwerkprogrammierung 2
M Socket String Arrays über Socket an Server schicken Netzwerkprogrammierung 2
D Socket Error: java.lang.NullPointerException Netzwerkprogrammierung 1
D TCP Socket funktioniert nicht richtig Netzwerkprogrammierung 3
X Problem mit vielen Bytes über Socket Netzwerkprogrammierung 23
B SSL Socket Netzwerkprogrammierung 2
A Socket Socket-Problem - Object wird nicht übertragen Netzwerkprogrammierung 3
M Client sendet nur, wenn das Socket geschlossen wird Netzwerkprogrammierung 53
R Dauerhaft offene Socket-Verbindung? Netzwerkprogrammierung 3
S Socket (client) verbindet nicht Netzwerkprogrammierung 6
G Socket Socket verbindung für Chat System Netzwerkprogrammierung 3
P Warum kann ich kein Socket aufbauen? Netzwerkprogrammierung 12
S Socket SSL Socket und Sun/Oracle Java Netzwerkprogrammierung 5
S Socket Socket Verbindung wiederherstellen Netzwerkprogrammierung 16
precoc Server Socket Start / Stop Netzwerkprogrammierung 5
N SOCKET mehrere Requests, keep Alive serverspezifisch? Netzwerkprogrammierung 3
S ImageIcon über Socket schicken (Serialisierung) Netzwerkprogrammierung 6
C Socket Systemsperren mit Socket Netzwerkprogrammierung 4
H Socket Objekte über Socket? Allgemeine Verständnisprobleme in Sachen Socket Netzwerkprogrammierung 3
D Socket Multithread-Socket | Kurz vor dem Ziel Netzwerkprogrammierung 7
D Socket Dynamische Socket-Thread Erzeugung Netzwerkprogrammierung 2
D Socket Socket absichtlich so schließen, dass Gegenseite java.net.SocketException: Connection reset wirft Netzwerkprogrammierung 4
J Socket Dateien über Socket auf Server speichern Netzwerkprogrammierung 3
S Socket-Frage zu einem LAN-Spiel. Netzwerkprogrammierung 3
A UDP verlorene Pakete/ socket.receive zu langsam Netzwerkprogrammierung 27
CookieSoft Socket Packet per Socket Netzwerkprogrammierung 8
CookieSoft Fehler bei Socket Netzwerkprogrammierung 4
D Socket Datei nur stückweise über Socket verschicken Netzwerkprogrammierung 6
T Per Socket auf POP3 zugreifen? Netzwerkprogrammierung 7
G Bild über Socket schicken - Client/Server Netzwerkprogrammierung 10
Z Socket Socket-Thread falsch? Netzwerkprogrammierung 5
Helgon Socket Socket IP Frage + Tutorial/Bücher Netzwerkprogrammierung 5
S Socket Verschiedene Exceptions beim Übertragen von Bildern über Socket Netzwerkprogrammierung 20
T Socket String zu Socket Netzwerkprogrammierung 26
M Datenübertragung per Socket nur alle 200ms Netzwerkprogrammierung 4
C Socket Socket: Connection timed out Netzwerkprogrammierung 3
T Socket blockierter Socket Netzwerkprogrammierung 4
T Alternative Socket mit Verbindungsabbruch Erkennung Netzwerkprogrammierung 2
M Socket, Ende Dateitransfer Netzwerkprogrammierung 4
X Über eine Socket-Verbindung Arrays übergeben Netzwerkprogrammierung 5
D RMI oder Socket Netzwerkprogrammierung 4
H Socket Socket listening Netzwerkprogrammierung 11
D Client Socket mit Eventlistener? Netzwerkprogrammierung 5
P Socket Verbindung über das Internet Netzwerkprogrammierung 2
A Socket Netzwerkprogrammierung 18
N Socket geht auf Windows, aber auf Mac nicht ? Netzwerkprogrammierung 3
ruffio1978 Telnet über ein socket ansprechen Netzwerkprogrammierung 8
G Exception: Connection reset by peer: socket write error Netzwerkprogrammierung 2
M SSl Socket Server und openssl key Netzwerkprogrammierung 3
J Socket Socket Programmierung. Wie anfangen? Netzwerkprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben