Was ist der beste Weg, um eine Buchse für neue Daten zu überwachen und dann diese Daten zu verarbeiten?

StackOverflow https://stackoverflow.com/questions/453609

Frage

Bitte entschuldigen Sie meinen C # .Net Neuling Status. Wenn dies offensichtlich ist, und ich verpasste es aus den Dokumenten, ein Link zu der entsprechenden Seite oder Beispielcode würde geschätzt.

Ich arbeite an einer Anwendung, die eine TCP-Socket-Verbindung von einer Java-Anwendung unterstützt werden. (Ja, Java auf dem Teil erforderlich ist. Es ist ein Sun SPOT-Gerät und Java ist die einzige Option.) Die Java-Anwendung regelmäßig neue Daten an die Steckdose zu schreiben wird, und meine app Aufgabe ist im byte [] zu nehmen, konvertieren es in eine Zeichenfolge, die Daten verarbeiten (Update UI, etc.) und möglicherweise leitet die Daten an einem anderen Computer eine ähnliche C # .NET-Anwendung ausgeführt wird.

Hier ist, was ich bisher getan habe: Im Augenblick ist die App spinnt einen Thread beim Start up, das eine Buchse öffnet. Die Java-Anwendung kann erfolgreich an die Steckdose anschließen, damit das funktioniert. Ich war bei dem Network der beginRead Methode suchen und der dataAvailable, length und CanRead Eigenschaften, aber ich bin nicht ganz sicher, wie zu ermitteln, wenn ich ein Paket von Daten gelesen habe, in die Regel etwa 512 Bytes kann aber variieren.

Wenn die Java-Anwendung Daten in den Stream schreibt oder es besteht ein Rückstau von Daten (Die Java-Anwendung wird die Daten wird vorbei ziemlich schnell.) Wie kann ich sicherstellen, dass ich nur ein Datenpaket zu einem Zeitpunkt, lese? Wenn die Java-Anwendung null beendet die Daten, wenn sie schreibt, wird das helfen? Ist es genug?

Schließlich wird die Buchse erhalten nur eine Verbindung, aber ich muss es offen halten, bis ein Fehler auftritt oder die Verbindung beendet wird. Was ist die anmutige Art und Weise, diesen Aspekt zu behandeln? Ich glaube nicht schließen und wieder öffnen mit jedem Datenpaket wegen des schnellen Feuer funktioniert (fast Echtzeit) Aspekt der Java-Anwendung, die auf dem Sun SPOT-Basisstation ausgeführt wird. Gerade jetzt, wenn die Basisstation beendet, meine app stirbt einen lauten und schmerzhaften Tod. :)

Danke fürs Lesen und für jede Hilfe können Sie anbieten.

War es hilfreich?

Lösung 3

Die Art, wie wir dieses Problem gelöst haben, ist eine Kombination von Sentinel-Zeichen und Feldern mit fester Breite haben. Die ersten zwei Bytes sind eine Länge Header für das gesamte Paket. Dann habe ich gelesen, das Paket in einem byte [] puffern und dann auf eigenen Paketstruktur verlassen, um zu wissen, dass zum Beispiel die ersten beiden Bytes sind jeweils als einzelne Felder interpretiert werden, und dann String-Felder sind mit dem \ n Zeichen abgeschlossen (0x0A, wenn Sie zu Hause sind Scoring). Dann werden lange Datenfelder verarbeitet in 8 aufeinander folgenden Bytes gelesen wurden, usw. Es scheint ziemlich gut für uns zu arbeiten, aber es ist offensichtlich eine Lösung für eine Situation, wo eine Kontrolle über die beiden Enden des Sockels und nicht dort, wo man nur die Lage das ein Ende zu steuern. Hoffe, das hilft jemand anderes.

Andere Tipps

"Wenn die Java-App-Daten in den Stream schreibt oder es besteht ein Rückstau von Daten (Die Java-Anwendung wird die Daten wird vorbei ziemlich schnell.) Wie kann ich sicherstellen, dass ich nur ein Datenpaket zu einem Zeitpunkt, lese? „

Achten Sie darauf, nicht davon ausgehen, dass Sie haben keine Kontrolle darüber, was Daten enden, in dem Paket auf. Wenn Sie versuchen, { 'H', 'e', 'l', 'l', 'o' } die Byte-Daten zu senden gibt es keine Garantie, dass alle diese Daten in einem einzigen Paket gesendet werden. Während es extrem unwahrscheinlich ist, ist es immer noch möglich, dass jedes Paket nur ein einziges Byte enthalten könnte, so dass Sie alle fünf Bytes in 5 verschiedenen Veranstaltungen erhalten würden. Der Punkt ist, verlassen Sie sich nicht auf die Pakete auf diese Weise. Stattdessen Ihre eigene End Of Message Terminatoren definieren und einfach werfen alle eingehenden Daten in einem Byte-Puffer irgendeiner Art und haben eine andere Funktion bei der Erkennung kommen, wenn es vorhanden jeder dieser Abbrecher sind. Wenn lesen, so zu diesem Terminator auf. So zum Beispiel sagen Sie die jeweilige Sendemethode aus Ihrer Java-Anwendung aufrufe zweimal mit den folgenden Daten:

{ 'H', 'e', 'l', 'l', 'o', '\0' }
{ 'W', 'o', 'r', 'l', 'd', '\0' }

Wie Sie Ihre Anwendung hergestellt werden, sollte die Daten erhalten sollen wie folgt sein:

Server receives { 'H', 'e', 'l' }
Data stored in byte buffer { 'H', 'e', 'l' }
Check byte buffer for message terminator '\0'. None found. Buffer unchanged, no message processed.
Server receives { 'l', 'o', '\0', 'W' }
Data stored in byte buffer { 'H', 'e', 'l', 'l', 'o', '\0', 'W' }
Check byte buffer for message terminator '\0'. 1 found, extracted message { 'H', 'e', 'l', 'l', 'o' } and buffer updated { 'W' }

Während also, dass nicht genau eine Antwort auf Ihre ursprüngliche Frage war ich denke, es sollte Sie in die richtige Richtung, um einen Schub geben.

Eine Sache, die Sie in laufen können, ist, dass es einfach gibt keine Zeichen, die keine Daten anstelle von Nachrichten Terminator sein könnten. Zum Beispiel enthalten viele Dateien die Daten \ 0, so würden diese Ihre Nachricht Erkennungs Wrack. Wie dies in der Regel behandelt wird durch eine Header-Spezifikation für Ihr Protokoll erstellen und Erkennen, ob Sie einen Header erwar (in diesem Fall der Suche nach \ 0 wird das Ende einer Nachricht bezeichnen) oder wenn Sie warten auf eine bestimmte Menge an Daten (die durch den letzten Header empfing angegeben werden.) Wenn dies keinen Sinn macht und Sie denken, Sie könnten diese Technik verwenden müssen, lassen Sie mich wissen und ich werde zu dieser Antwort hinzuzufügen.

Wenn Sie das Lesen von Daten-Streaming Sie einige Sentinel / Abschlusszeichen oder eine bekannte Größe der Daten benötigen, um zu bestimmen, wenn das Lesen zu stoppen und die Informationen verarbeiten. Null-Zeichen oder Zeilenumbrüche sind häufig. Eine andere Technik ist unter Verwendung einer festen Größe Header, der die Länge des Körpers angibt.

Die Fassung bleibt geöffnet, bis Sie es schließen oder die andere Seite endet, wobei in diesem Fall eine Fehlermeldung angezeigt wird, während aus der Steckdose zu lesen, die Sie shuold behandeln. Network eine IOException aus, wenn der Stecker von der Remote-Seite während einer Lese geschlossen wurde oder Schreibvorgang.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top