Socket NIO-Server/Client-Abgeschnittene Nachrichten (Strings)

Braumeister

Mitglied
Hallo Forum!

Ich habe ein Problem mit meinem NIO-Server bzw. Client.
Ich nutze momentan eine Echo-Server-Beispiel-Implementierung zur
Übertragung von XML-Dokumenten zwischen Client und Server.

Bisher hatte ich keine Probleme damit. Als jedoch die Dokumente ETWAS größer wurden
ist die Übertragung fehlerhaft geworden, sodass der Client sehr oft nur abgeschnittene
XMLs eingelesen hat, was dann natürlich zu Parse-Exceptions führte.
Ich rede hier von Dokumentgrößen von 4 KB, was nicht wirklich groß ist ;).
Dennoch scheint dieses Problem bei kleinen Dokumenten nicht aufzutauchen.

Ich habe mit entspr. auch schon die Anz. der übertragenen Bytes ausgeben lassen, was das Problem
bestätigte. Es scheint so, als ob die Übertragung durch etwas unterbrochen wird o.ä. .

Auch lag es nicht an Buffer-Größen, die ich auch mal nach oben geschraubt habe.

Das merkwürdige ist halt, dass es "nur" zu 90% passiert, also nicht IMMER.

Hat jemand dafür eine Erklärung?
Bei Bedarf kann ich den Source-Code auch schicken.

Gruß,
Braumeister
 

tagedieb

Top Contributor
Nun, der Fehler liegt im Example selber...

Die Daten werden in Datenpacketen uebers Netz verschickt. Bei grossen Datenmengen werden diese in mehrere Packete aufgeteilt.
Code:
socketChannel.read()
liest wahrscheinlich nur ein Packet nach dem andern, somit muessen die Daten ueber eine Schleife eingelesen werden.
Kurze Strings wie im Beispiel werden natuerlich nicht unterteilt und in einem Zug uebermittelt, deshalb funktioniert es da.

Mit der folgenden Client sollte dein Program funktionieren. Im Server solltest du die entsprechende Methode auch fixen, wenn du die Daten vom Client in einem Stueck verarbeiten willst.

Java:
	private void read(SelectionKey key) throws IOException {
		SocketChannel socketChannel = (SocketChannel) key.channel();

		// Clear out our read buffer so it's ready for new data
		this.readBuffer.clear();

		// Attempt to read off the channel
		int numRead, length = 0;
		try {
			while ((numRead = socketChannel.read(this.readBuffer)) > 0) {
				System.out.println("read: " + numRead);
				length += numRead;
			}

		} catch (IOException e) {
			// The remote forcibly closed the connection, cancel
			// the selection key and close the channel.
			key.cancel();
			socketChannel.close();
			return;
		}

		if (numRead == -1) {
			// Remote entity shut the socket down cleanly. Do the
			// same from our end and cancel the channel.
			key.channel().close();
			key.cancel();
			return;
		}

		// Handle the response
		this.handleResponse(socketChannel, this.readBuffer.array(), length);
	}
 

Braumeister

Mitglied
Danke für die Antwort!

In der Tat denke ich, dass das sinnig ist.
Allerdings trat der Fehler auch dabei auf.

Der Knackpunkt ist halt, dass es ab einer gewissen Datenmenge oft passiert,
aber eben nicht IMMER. Läge es daran, dass ich nur das erste Packet einlesen würde,
so hätte ich den Fehler jedes Mal.

Ich habe jedoch offenbar einen kleinen Workaround hinbekommen.

Für den Fall, dass der Fehler vorkommen würde, sieht der Ablauf womöglich so aus:
1) Einlesen des ersten Packetes
2) Keine Bytes mehr zum Einlesen -> Beenden
3) Etwas später wären aber die restlichen Bytes zum Einlesen bereit, die er aber nicht mehr
einliest.

Mein Workaround liegt nun einfach darin, dass ich den Thread 50 ms warten lasse, bevor er mit
der nächsten Leseoperation beginnt.
Das führt mich zwar nicht auf den Grund des Problems, reicht aber evtl. , damit ich mit der eigentlichen App weitermachen kann.

Ich bin aber weiterhin an der Lösung des Problems interessiert, da solche "Lösungen" oft nur kurze Gültigkeit haben.

Gruß,
Braumeister
 

Empire Phoenix

Top Contributor
Habe mit nio noch nicht direkt gearbeitet, sondern nur mit der socket api aber:
Ruft der Client flush oder sowas auf, sonst könnte das erklären warum ein teil der daten teilweise erst verzögert kommt?
In dieser Verbindung könnte das nur sporadische auftreten mit dem Nagles algorithmus zusammenhängen.
Zur Lösung:

Versuch mal das lesen so zu gestalten, das der ließt, bis die Gegenseite den stream schließt, bzw ein Übertragung beendet sendet (zb eine Kette in xml nicht zugelassener Sonderzeichen).
Es kann ja durchaus vorkommen, das noch keine neuen Daten da sind, weil die noch auffen Weg im netz sind und somit keine im lesebuffer sind sprich verfügbar, aber es halt nicht beended ist.
 

tagedieb

Top Contributor
Ich hab mir das Program nochmal angesehen und den 'anderen' Fehler gefunden.

Die Daten werden uebers Netz in mehreren Packete verteilt verschickt (haengt vom Netzwerk, Latency,usw. ab). Im guenstigsten Fall kann er es in einem Packet verschicken, dann brauchst du auch nur einmal zu lesen. Das Lesen ist aber auf jeden Fall auf die Groesse des Buffers beschraenkt. Wenn deine Datei groesser als der 8192 ByteBuffer wirst du immer mehrmals lesen muessen.

Das 'Problem' im Beispiel ist, dass in der Methode
Code:
handleResponse(...)
nach dem ersten Lesen der Channel geschlossen wird, somit werden die restlichen Daten nie aus dem Channel ausgelesen. Wenn du
Code:
socketChannel.close();
und
Code:
socketChannel.keyFor(this.selector).cancel();
auskommentierst funktioniert das Original ohne Probleme.

Der EchoWorker gibt einfach zurueck was er gelesen hat. Hier spielt es keine Rolle ob die Uebertragung vollstaendig war oder nicht. Es schickt einfach die Datenfetzen welche er erhalten hat zurueck an den Client. Somit wird auch nicht festgestellt wann de Uebertragung abgeschlossen wurde. Das brauchst du natuerlich wenn du wissen willst ob dein File nun vollstaendig uebertragen wurde.


PS. Die 'queues' zwischen Server und Worker sehen komisch aus. In einer Queue kann meiner Meinung nach immer nur 1 ServerDataEvent drin stehen, da der Code in einem
Code:
synchronized
Block ausgefuehrt wird. Sinnvoller waere hier eine BlockingQueue. Dasselbe mit der 'pendingChanges' List..
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Performanteste Kommunikationsmethode zwischen Client u. Server Netzwerkprogrammierung 4
L Socket Automatische Zuweisung von Server und Client Rolle Netzwerkprogrammierung 12
ExceptionOfExpectation Server/Client-Kommunikation Netzwerkprogrammierung 34
M Server-Client-System für Browsergame Netzwerkprogrammierung 5
Yonnig Threads mit Client/Server und GUI (laufend bis button-click) Netzwerkprogrammierung 9
J Client-Server und SOAP Netzwerkprogrammierung 23
L30nS RMI Aufruf einer Client-Methode von einem RMI-Server Netzwerkprogrammierung 3
T String von Client zu Server kommt nicht an Netzwerkprogrammierung 92
D WebSocket Server mit HTML Client und Java Server Netzwerkprogrammierung 5
D Server - Client Informationsaustausch, Möglichkeiten Netzwerkprogrammierung 3
H Socket Chat entwickeln mit Java Server Client Netzwerkprogrammierung 4
X Kann ich einen Client/Server verbindung hinkriegen die mir alle paar Sekunden die aktuellen Daten per Realtime zuschickt ? Netzwerkprogrammierung 9
D Slf4j - Logging - Client-Server Architektur Netzwerkprogrammierung 3
J client server mit nur einem PC Netzwerkprogrammierung 33
M Socket Nachricht von TCP-Client an Server schicken Netzwerkprogrammierung 12
M Socket Verbindung Matlab(Server) Java(Client) Netzwerkprogrammierung 1
R Socket FATAL EXCEPTION MAIN bei Socket based client/server app Netzwerkprogrammierung 2
G Server-Client IO Problem Netzwerkprogrammierung 6
I Socket Das erste Server-Client Programm Netzwerkprogrammierung 16
M Socket Server antwortet dem Client nicht Netzwerkprogrammierung 6
I Client/Server Kommunikation bei einem Spiel Netzwerkprogrammierung 4
E Objekte versenden, Client-Server Netzwerkprogrammierung 25
C Mini Client-Server-Anwendung funktioniert nicht Netzwerkprogrammierung 8
P Server als Client nutzen Netzwerkprogrammierung 8
D Socket Run Args Client/Server Socket Netzwerkprogrammierung 1
Cromewell Socket Multithreaded Server und Client Netzwerkprogrammierung 1
Y Client/Server/DB communication Netzwerkprogrammierung 3
JavaWolf165 Socket mit .writeUtf etwas vom Client zum Server schicken Netzwerkprogrammierung 13
P RMI Client Server Programm über Internet Netzwerkprogrammierung 2
brainless Client Server Kommunikation verschlüsseln Netzwerkprogrammierung 13
gamebreiti Socket Server / Client Anwendung Manipulation von Objekten durch Server Netzwerkprogrammierung 9
T Socket Server/Client Kommunikation Netzwerkprogrammierung 8
F Server Client Anwendung mit UDP Netzwerkprogrammierung 2
A RMI Wo treten Exceptions bei RMI Aufrufen auf? Auf Client oder auf Server? Netzwerkprogrammierung 3
A ByteBuffer - Client/Server Netzwerkprogrammierung 9
K C# Server - Android Client Netzwerkprogrammierung 0
P MIME-TYPE Erklaerung, Kommunikation zwischen Client und Server Netzwerkprogrammierung 3
J Sichere Kommunikation bei Server Client Netzwerkprogrammierung 3
T Frage zu Client-Server Applikation Netzwerkprogrammierung 2
H Socket Client/Server Socket Programmieren Netzwerkprogrammierung 1
M Theoretische Frage zu Server - Client Netzwerkprogrammierung 2
P HTTP Server / Client Netzwerkprogrammierung 1
E Thematik Client server Netzwerkprogrammierung 2
D Client/Server per Crossover Lan Kabel Netzwerkprogrammierung 1
S Client Server Connection Netzwerkprogrammierung 4
V erste Client - Server Anwendung, paar Fragen wie Socketverbindung checken usw. Netzwerkprogrammierung 4
S Sichere Server/Client Architektur Netzwerkprogrammierung 1
D Chat Server/mehre Client Netzwerkprogrammierung 9
I Server+Client Netzwerkprogrammierung 3
N Client am Server abmelden Netzwerkprogrammierung 0
F Server/Client Probleme Netzwerkprogrammierung 3
U Socket Instant Messanger (Server Linux, Client Windows) Netzwerkprogrammierung 1
Athena Grundsatzfragen zu Client-Server-Architektur / Matchmaking Netzwerkprogrammierung 1
A Problem beim Senden von Client zu Server Netzwerkprogrammierung 10
F Client Server DB Netzwerkprogrammierung 0
A Verständnisfrage Multi-Threaded Client/Server Netzwerkprogrammierung 5
F Tipps zum Thema Server/Client vie SOAP Netzwerkprogrammierung 0
F Socket Java - Server/Client simple Netzwerkprogrammierung 1
R Zeitliche Syncronisation Server - Client Netzwerkprogrammierung 0
S Server-Client: Image senden Netzwerkprogrammierung 2
C Multithreading Client / Server erklärt Netzwerkprogrammierung 11
P server - client verbindung (anfänger) Netzwerkprogrammierung 8
J Client Server - Serialisierung Netzwerkprogrammierung 8
Luk10 Server / Client: Clients speichern! Netzwerkprogrammierung 6
M allgemeine Frage über Server-Client-Kommunikation Netzwerkprogrammierung 5
K Client => Server Netzwerkprogrammierung 2
A ? Home-Network, Server/Client-Einrichtung Netzwerkprogrammierung 4
S Socket Server: ConnectionError vom Client erkennen Netzwerkprogrammierung 31
A Java Server - IOS Client Applikation Netzwerkprogrammierung 20
L Ratschlag zur Umsetzung einer client-server-Kommunikation Netzwerkprogrammierung 6
M RMI RMI Probleme zwischen Client und Server Netzwerkprogrammierung 5
J Erster Server-Client läuft auf lokalem Rechner problemlos. Zwei Rechner über das Internet nicht Netzwerkprogrammierung 8
N Client-Server-Datenbank Netzwerkprogrammierung 13
Kjubert Synchronisieren von Objekten über Client/Server - bester Weg? Netzwerkprogrammierung 7
B Client/Server Connection Problem Netzwerkprogrammierung 2
S Server Client Daten hin und herschicken Netzwerkprogrammierung 2
R Server zu Client Kommunikation Netzwerkprogrammierung 11
D TCP Verbindung (Java Client und Visual Basic Server) Netzwerkprogrammierung 12
S Socket Applet Client bekommt keine GLOBALE Verbindung zum Server Netzwerkprogrammierung 25
T Server und Client verbinden nicht Netzwerkprogrammierung 6
D Server Client Verbindung - Unexpected End of File - Invalid HTTP Response Netzwerkprogrammierung 4
V Socket UDP Server/Client Kommunikation sehr langsam Netzwerkprogrammierung 2
das-mo Client/Server sendet nicht Netzwerkprogrammierung 7
Z Socket Server/Client vernünftiger Verbindungsabbruch Netzwerkprogrammierung 4
G Bild über Socket schicken - Client/Server Netzwerkprogrammierung 10
F TCP Server/Client Netzwerkprogrammierung 14
M Problem Client - Server Sockets: .ready() wird nie true! Netzwerkprogrammierung 6
Ollek Socket Sucher passende Server/Client Lösung für meine Anwendung Netzwerkprogrammierung 2
N eine klasse mit server & client Netzwerkprogrammierung 5
D RMI Gui auf client updaten basierend auf den Property Änderung des Models auf dem Server ohne polling Netzwerkprogrammierung 12
T Socket Client versucht zyklische Verbindung zum Server Netzwerkprogrammierung 4
S Socket Einfache Client/Server-Anwendung Netzwerkprogrammierung 11
F Socket Server/Client Kommunikation Netzwerkprogrammierung 4
X Problem mit Server-Client-Kommunikation Netzwerkprogrammierung 14
D Projektstruktur / Architektur (Client-Server) Netzwerkprogrammierung 9
P Socket IRC Client nicht kompatibel mit Server Netzwerkprogrammierung 30
F FTP Client mit Sockets - wann sagt der Server nichts mehr? Netzwerkprogrammierung 7
B RMI Server - Client - Aufteilung/Prinzip Netzwerkprogrammierung 11
N Server Client TCP IP Netzwerkprogrammierung 3
M Übersicht client/server implementationen und Frameworks (mithilfe gesucht!) Netzwerkprogrammierung 6

Ähnliche Java Themen

Neue Themen


Oben