Hallo,
vorweg, ich bin neu in Java.
Ich hab im Forum nichts gefunden, wie ich vermeiden kann, dass ich TCP-Nachrichten in meiner Anwendung übersehe.
Klar, in TCP sollte eigentl. nichts verloren gehen, daher vermute ich, der Fehler liegt in meiner Anwedung/Netzwerkaufruf.
Kurz zum Prgramm:
Ich lese vom Heim-Netzwerk von einem anderen PC die an mich geschickten Nachrichten (TCP). Auf den "Sender" der Daten habe ich keine Einfluss.
Die Nachrichten sind kurze Strings, wenige hundert Bytes.
Die Nachrichten, die ich bekomme sind inkrementell, d.h. in jeder Message wird nicht alles uebertragen, sondern nur Differenzen zu den vorangegangenen Werten. Daher darf nichts übersehen werden. Es gibt keine Paketnummern.
Die Netzwerk-Kommunikation erfolgt in einem eigenen Thread, losgeloest v. der eigentl. Anwendung.
Die Leseroutine (s.u.) ist in einer Endlosschleife ohne sleep() eingebettet.
Der Socket ist mit SoTimeout erzeugt:
Nun habe ich den Verdacht, dass manchmal in (sehr) kurzer Folge 2-3 Nachrichten hintereinander kommen, ich aber nur jew. das letzte in meiner Anwedung lese.
In der Ausgabe des LOGGERs kann ich nachvollziehen, dass manchmal Nachrichten fehlen.
Aber wie komme ich an die fehlenden/übersehenen/verlorenen Nachrichten?
Ich kann leider nicht mal mit Sicherheit behaupten, dass sie überhaupt gesendet wurden ???:L
Aber wie stelle ich sicher, dass ich keine Nachricht übersehe und wie komme ich an die ggf. "übersehenen" Pakete? Hat eine(r) von Euch 'ne Idee?
Hier meine Leseroutine Code in Auszügen.
Ist meine Implementierung schon im Ansatz falsch?
Wie müsste ich den Code umschreiben, damit ich keine Nachrichten übersehe/überspringe.
Danke und Gruss, Holger
vorweg, ich bin neu in Java.
Ich hab im Forum nichts gefunden, wie ich vermeiden kann, dass ich TCP-Nachrichten in meiner Anwendung übersehe.
Klar, in TCP sollte eigentl. nichts verloren gehen, daher vermute ich, der Fehler liegt in meiner Anwedung/Netzwerkaufruf.
Kurz zum Prgramm:
Ich lese vom Heim-Netzwerk von einem anderen PC die an mich geschickten Nachrichten (TCP). Auf den "Sender" der Daten habe ich keine Einfluss.
Die Nachrichten sind kurze Strings, wenige hundert Bytes.
Die Nachrichten, die ich bekomme sind inkrementell, d.h. in jeder Message wird nicht alles uebertragen, sondern nur Differenzen zu den vorangegangenen Werten. Daher darf nichts übersehen werden. Es gibt keine Paketnummern.
Die Netzwerk-Kommunikation erfolgt in einem eigenen Thread, losgeloest v. der eigentl. Anwendung.
Die Leseroutine (s.u.) ist in einer Endlosschleife ohne sleep() eingebettet.
Der Socket ist mit SoTimeout erzeugt:
Java:
...
SocketAddress socketAddr
= new InetSocketAddress( nameOrAddress, port );
socket = new Socket();
socket.connect(socketAddr, 1000); // allow time to connect
// socket = new Socket(nameOrAddress, port);
socket.setSoTimeout(1100); // set socket read timeout
...
inStream = sock.getInputStream();
outStream = sock.getOutputStream();
...
Nun habe ich den Verdacht, dass manchmal in (sehr) kurzer Folge 2-3 Nachrichten hintereinander kommen, ich aber nur jew. das letzte in meiner Anwedung lese.
In der Ausgabe des LOGGERs kann ich nachvollziehen, dass manchmal Nachrichten fehlen.
Aber wie komme ich an die fehlenden/übersehenen/verlorenen Nachrichten?
Ich kann leider nicht mal mit Sicherheit behaupten, dass sie überhaupt gesendet wurden ???:L
Aber wie stelle ich sicher, dass ich keine Nachricht übersehe und wie komme ich an die ggf. "übersehenen" Pakete? Hat eine(r) von Euch 'ne Idee?
Hier meine Leseroutine Code in Auszügen.
Java:
private String readMessage () {
String dataLine = "";
try {
BufferedReader in = new BufferedReader(new InputStreamReader(inStream));
dataLine = in.readLine(); // blocking read ...
dataTime = System.currentTimeMillis(); // ... add data time stamp
if (LOGGER.isTraceEnabled()) {
LOGGER.trace("readLine(): " + dataLine);
}
}
catch (SocketTimeoutException ste) {
/* read timed out -> application paused ... */
LOGGER.trace("SocketTimeoutException from readline(): "+ste.toString());
}
catch (IOException ioe) {
/* read problem */
LOGGER.warn("IOException from readLine(): "+ioe.toString());
// FIXME: close socket, inStream, outStream
}
finally {
// FIXME: close logfile
}
return dataLine; // return message or empty string
} /* end readMessage */
Ist meine Implementierung schon im Ansatz falsch?
Wie müsste ich den Code umschreiben, damit ich keine Nachrichten übersehe/überspringe.
Danke und Gruss, Holger