Class StreamDemultiplexer
java.lang.Object
de.bsvrz.sys.funclib.communicationStreams.StreamDemultiplexer
public class StreamDemultiplexer
extends java.lang.Object
Diese Klasse empfängt Nutzdatenpakete, die vom StreamMultiplexer über Streams versandt wurden. Dabei werden die Daten in streams aufgeteilt. Jeder
stream stellt dabei der Applikation Nutzdaten zur Verfügung, die sie mit einer Methode abrufen kann. Der StreamMultiplexer wird benachrichtigt
falls die Applikation Nutzdaten benötigt. Dieser sorgt dann dafür, dass neue Daten auf dem dafür vorgesehenen Stream bereitgestellt werden. Das
Speichern der Nutzdaten geschieht in einem Puffer, unterschreitet die Anzahl der vorgehaltenen Daten einen bestimmten Wert, so fordert der
StreamDemultiplexer neue Nutzdaten vom StreamMultiplexer an. Dies gewährleistet einen ständigen Vorrat von Nutzdaten, auf die die Applikation
zugreifen kann.
-
Constructor Summary
Constructors Constructor Description StreamDemultiplexer(int numberOfStreams, int blockingFactor, StreamDemultiplexerDirector director)
-
Method Summary
Modifier and Type Method Description void
abort(int indexOfStream)
Eine Methode zum beenden eines Streams.void
killAllStreams()
Die physische Verbindung zum Sender ist zusammengebrochen und alle Streams werden beendet.void
receivedDataFromSender(byte[] streamDataPacket)
Ein streamDataPacket, das der Multiplexer verschickt hat, wird entgegen genommen.byte[]
take(int indexOfStream)
Diese Methode gibt die Nutzdaten eines bestimmten Streams an die Empfängerapplikation zurück.Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Constructor Details
-
StreamDemultiplexer
public StreamDemultiplexer(int numberOfStreams, int blockingFactor, StreamDemultiplexerDirector director)- Parameters:
numberOfStreams
- Anzahl von Streams, die Datenpakete versenden sollenblockingFactor
- Puffer des Empfängers (dieser Wert muß größer gleich 1 sein)director
- Schnittstelle, die eine Methode zum verschicken von Informationen an den Sender bereitstellt (siehe Interface Beschreibung)- Throws:
java.lang.IllegalArgumentException
- Der blockingFactor war kleiner als 1
-
-
Method Details
-
abort
public void abort(int indexOfStream)Eine Methode zum beenden eines Streams. Die restlichen Daten, die sich im _arrayOfStreams befinden, werden gelöscht. An den Sender der Daten wird ein "-1" geschickt, dieser wird darauf hin keine Daten mehr auf diesem Stream schicken. Der Stream wird über seinen Index identifiziert.- Parameters:
indexOfStream
- Index des Streams, der beendet werden soll
-
take
public byte[] take(int indexOfStream) throws java.lang.InterruptedException, java.lang.IllegalStateException, java.net.ProtocolException, java.nio.channels.ClosedChannelExceptionDiese Methode gibt die Nutzdaten eines bestimmten Streams an die Empfängerapplikation zurück. Wenn alle Nutzdatenpakete von der Senderapplikation mit take angefordert wurden, gibt diese Methode nur noch null zurück, im Fehlerfall werden entsprechende Exceptions geworfen.- Parameters:
indexOfStream
- Eindeutiger Index des Streams, der Daten zurückgeben soll- Returns:
- Die Nutzdaten werden als Byte-Array geliefert
- Throws:
java.lang.InterruptedException
- Ein Thread, der Nutzdaten mit take anfordert hat, wird mit Interrupt abgebrochen.java.lang.IllegalStateException
- Ein Stream wurde mit abort durch die Empfängerapplikation beendet und anschließend führte die Empfängerapplikation erneut ein take auf diesen Stream aus.java.net.ProtocolException
- Es wurde ein Paket mit einem falschen Index bearbeitet. Das deutet darauf hin, dass das Paket entweder schon einmal empfangen wurde (doppelt vorhanden) oder das ein Paket fehlt. Der Stream wird automatisch abgebrochen. Die Applikation kann weiter "take" aufrufen, wird aber immer für diesen Stream, diese Exception bekommen.java.nio.channels.ClosedChannelException
- Die physische Verbindung zum Sender wurde unterbrochen. Jeder take Aufruf wird für alle Streams diese Exception ausgeben, da alle Streams betroffen sind
-
receivedDataFromSender
public void receivedDataFromSender(byte[] streamDataPacket) throws java.io.IOExceptionEin streamDataPacket, das der Multiplexer verschickt hat, wird entgegen genommen. Es hat als Inhalt den Index des Streams (die ersten 4 Bytes), den Index des Pakets (die nächsten 4 Bytes), die Größe des Byte-Arrays in dem die Nutzdaten gespeichert waren und die Nutzdaten selber (der Rest).Diese Methode erzeugt dann aus dem Byte-Array die benötigten Objekte und legt diese in den dafür vorgesehenen Datenstrukturen ab.
Der Empfang neuer Nutzdaten wird von der Applikation an den StreamDemultiplexer geleitet (dadurch hat die Applikation den Datentransfer als Aufgabe).
- Parameters:
streamDataPacket
- Ein Byte-Array in dem verschlüsselt der Index des Streams, der Index des Pakets, die Größe des Byte-Arrays in dem die Nutzdaten gespeichert sind und die Nutzdaten selber stehen.- Throws:
java.io.IOException
- Es ist ein Fehler beim deserialisieren der Daten aufgetreten
-
killAllStreams
public void killAllStreams()Die physische Verbindung zum Sender ist zusammengebrochen und alle Streams werden beendet. Allen Streams wird die Erlaubnis zum empfangen/senden entzogen. Diese Methode wird von der übergeordneten Applikation aufgerufen, diese bemerkt den Fehler.
-