P
Philipp91
Gast
Hallo,
ich habe folgende Ausgangssituation:
Ich sende über TCP Daten von C# nach Android/Java. Es gibt eine Steuerverbindung (über die noch viele andere Sachen laufen, u.a. auch, welche Datei gleich auf der Datenverbindung ankommt) und eben diese Datenverbindung, auf der alle übertragenen Daten die Größe 4608 Bytes haben.
Auf der Java-Seite haben beide TCP-Verbindungen ein java.net.Socket, das aus ServerSocket.accept() kommt, im Falle der Steuerverbindung sind um die beiden Streams noch Reader-Klassen drumrum, aber auf der Datenverbindung wird nur gelesen, und zwar, indem direkt vom InputStream die .read-Methode für 4608 Bytes aufgerufen wird. C# sendet mit System.Net.Socket.Send() - wahlweise auch asynchron.
Jetzt ergibt sich folgendes Problem:
Über die Steuerverbindung wird immer mal wieder eine Flut von Daten (z.B. 500*4608 Bytes) angestoßen. Über die Steuerverbindung schickt C# dann die 500 Infos und über die Datenverbindung die 500 Daten, wobei letzteres nicht flüssig durchläuft, sondern dann verlangsamt, wenn Android nicht mehr hinterherkommt und auch der/die? Buffer voll sind.
Jetzt kann es aber sein, dass Android findet, das reicht (weil die Activity geschlossen wird und eine andere aufgerufen wird). Dann wird über die Steuerverbindung ein neuer Datenstrom initiiert, aber es kommt JEDES MAL noch ein Rest vom vorherigen Datenstrom an, wenn der noch nicht vollständig abgearbeitet war. Dadurch kommen die Daten natürlich völlig durcheinander.
Also brauche ich:
Sowohl bei C#, aber insbesondere bei Java eine Funktion, um zu sagen: ignoriere alles, was jetzt grade noch ankommt. Am besten soll der Thread so lange blockiert werden, bis er mit dem Ignorieren fertig ist, damit ich dann mit dem Anfragen der neuen Datenmenge weitermachen kann.
Socket.skip() bzw. auch .read() wollen leider eine Byte-Zahl wissen, die weiß ich aber nicht. Die Dokumentation sagt, dass .available() ungenau ist.
Wäre nett, wenn ihr einem C#er sagen könnt, wie man das unter Java realisiert - aber um ehrlich zu sein, habe ich unter C# die Funktion auch nicht gefunden.
Vielen Dank für eure Hilfe
Philipp
ich habe folgende Ausgangssituation:
Ich sende über TCP Daten von C# nach Android/Java. Es gibt eine Steuerverbindung (über die noch viele andere Sachen laufen, u.a. auch, welche Datei gleich auf der Datenverbindung ankommt) und eben diese Datenverbindung, auf der alle übertragenen Daten die Größe 4608 Bytes haben.
Auf der Java-Seite haben beide TCP-Verbindungen ein java.net.Socket, das aus ServerSocket.accept() kommt, im Falle der Steuerverbindung sind um die beiden Streams noch Reader-Klassen drumrum, aber auf der Datenverbindung wird nur gelesen, und zwar, indem direkt vom InputStream die .read-Methode für 4608 Bytes aufgerufen wird. C# sendet mit System.Net.Socket.Send() - wahlweise auch asynchron.
Jetzt ergibt sich folgendes Problem:
Über die Steuerverbindung wird immer mal wieder eine Flut von Daten (z.B. 500*4608 Bytes) angestoßen. Über die Steuerverbindung schickt C# dann die 500 Infos und über die Datenverbindung die 500 Daten, wobei letzteres nicht flüssig durchläuft, sondern dann verlangsamt, wenn Android nicht mehr hinterherkommt und auch der/die? Buffer voll sind.
Jetzt kann es aber sein, dass Android findet, das reicht (weil die Activity geschlossen wird und eine andere aufgerufen wird). Dann wird über die Steuerverbindung ein neuer Datenstrom initiiert, aber es kommt JEDES MAL noch ein Rest vom vorherigen Datenstrom an, wenn der noch nicht vollständig abgearbeitet war. Dadurch kommen die Daten natürlich völlig durcheinander.
Also brauche ich:
Sowohl bei C#, aber insbesondere bei Java eine Funktion, um zu sagen: ignoriere alles, was jetzt grade noch ankommt. Am besten soll der Thread so lange blockiert werden, bis er mit dem Ignorieren fertig ist, damit ich dann mit dem Anfragen der neuen Datenmenge weitermachen kann.
Socket.skip() bzw. auch .read() wollen leider eine Byte-Zahl wissen, die weiß ich aber nicht. Die Dokumentation sagt, dass .available() ungenau ist.
Wäre nett, wenn ihr einem C#er sagen könnt, wie man das unter Java realisiert - aber um ehrlich zu sein, habe ich unter C# die Funktion auch nicht gefunden.
Vielen Dank für eure Hilfe
Philipp