Ich habe ein Java-Applet, das Video (MJPEG) von einem Server streamt. Ich schrieb einen Proxy-Server in C # (Windows-Dienst), um zwischen dem Applet und mehreren Videoservern zu setzen. Ein HTML / CSS / Js-Frontend wird zusammen mit dem Java-Applet verwendet. Alle Funktionen funktionieren gut (endlich !!!), bis auf eine Sache.
Mit dem Videoserver können Sie aufgezeichnete Videos über eine REST-Schnittstelle wiedergeben. Wenn der Clip fertig ist, lässt der Server die Verbindung offen, falls Sie Befehle wie Zurückspulen oder Suchen senden möchten. Der Clip wird bis zum Ende im Applet gut abgespielt. Wenn Sie versuchen, einen neuen Clip zu starten (was einen Befehl von Javscript an das Applet sendet), friert der Browser ein. Allerdings funktionieren nachfolgende Befehle, die dieselbe Verbindung verwenden, wie Wiedergabe, Pause und Suche. Wenn ich den Windows-Dienst stoppe, reagiert der Browser wieder.
Dies ist, was ich angenommen habe passiert: Der Clip endet (oder ist pausiert); Es werden keine weiteren Daten gesendet, aber die Verbindung ist noch aktiv. Das Applet wartet auf dem Proxy für den nächsten Frame, aber der Proxy wartet auf dem Videoserver auf den nächsten Frame, der keine weiteren Daten senden wird.
Dies ist der Code in einer while-Schleife, die jedes Frame liest
%Vor%Ich muss diesen Code irgendwie unterbrechen.
Wenn ein neuer Videoclip im HTML-Frontend ausgewählt wird, benachrichtigen wir das Applet, das disconnect () in der CameraStream-Klasse aufruft. Das ist diese Funktion:
%Vor% Um das zu testen, lasse ich einen kurzen Clip abspielen und laufe bis zum Ende. Ich wähle dann einen neuen Clip aus. In meiner Java-Konsole erhalte ich die Ausgabe disconnect called.
, bekomme aber nicht die nachfolgende closed.
-Meldung, noch wird diese generische Ausnahme abgefangen. Wenn ich den Windows-Dienst stoppe, bekomme ich schließlich die Nachricht closed.
, so scheint es, dass inputStream.close();
blockiert.
Ich denke also, meine Frage ist, wie kann ich die Blockierung stoppen? Blockiert der readFully(img)
-Aufruf? Oder ist es die Trennfunktion (wie von der Konsolenausgabe vorgeschlagen)?
edit: nur um zu verdeutlichen, schrieb ich das Java-Applet, HTML, CSS, Javascript und C # -Proxy-Server, so dass ich Zugriff auf all diesen Code habe. Der einzige Code, den ich nicht ändern kann, ist der der REST-Schnittstelle auf dem Videoserver.
edit2: Ich wollte für diesen Beitrag Kopfgeld machen Ссылка
Ich habe endlich die Antwort gefunden:
%Vor%Obwohl ich eine HttpUrlConnection verwende, die eine Möglichkeit hat und keinen Ausgabestream hat, hat das Versuchen, den Ausgabestrom zu schließen, eine Ausnahme ausgelöst und aus irgendeinem Grund hat alles funktioniert.
Im Allgemeinen blockieren Java I / O-Methoden. Die beste Lösung scheint darin zu bestehen, einen weiteren Thread zum Lesen der Daten und zum Verwenden von NIO-Puffern zu erstellen. Beispiel für NIO-basiertes Lesen (Warnung: ungetestet!):
%Vor% Dieser Code erstellt ein Channel
von InputStream
und verwendet Channel
, um Daten zu lesen. Das JavaDoc für die Funktion ReadableByteChannel.read(ByteBuffer)
besagt, dass das Unterbrechen des Threads, der den Aufruf von inChannel.read(buf)
enthält, das Lesen stoppt.
Sie müssen diesen Code anpassen, ich habe ihn einfach aus dem Kopf gezogen. Viel Glück!
Tags und Links java blocking datainputstream