public class StreamMultiplexer
extends java.lang.Object
Constructor | Description |
---|---|
StreamMultiplexer(int numberOfStreams,
int blockingFactor,
int bufferSizeStreamMultiplexer,
int serializerVersion,
StreamMultiplexerDirector director) |
Modifier and Type | Method | Description |
---|---|---|
void |
killAllStreams() |
Alle Streams werden beendet, da die Verbindung zum Empfänger unterbrochen wurde.
|
void |
sendAllStreamData() |
Diese Methode verschickt Nutzdaten, die die Senderapplikation erzeugt hat, an den Empfänger (StreamDemultiplexer).
|
void |
setMaximumStreamTicketIndexForStream(byte[] streamTicketPacket) |
Diese Methode setzt den "maximumStreamTicketIndex" eines Streams herauf.
|
public StreamMultiplexer(int numberOfStreams, int blockingFactor, int bufferSizeStreamMultiplexer, int serializerVersion, StreamMultiplexerDirector director)
numberOfStreams
- Anzahl von Streams, die Datenpakete versenden sollenblockingFactor
- Anzahl der Pakete, die initial am Anfang versendet werdenbufferSizeStreamMultiplexer
- Diese Variable bestimmt die gesamte Größe des Puffers, der zum StreamMultiplexer
gehörtserializerVersion
- Diese Variable legt die Versionsnummer des Deserializer/Serializer fest, der
benutzt wird. Sowohl der StreamMultiplexer als auch der StreamDemultiplexer
müssen die selbe Version benutzendirector
- Schnittstelle, die eine Methode zum verschicken von Informationen an den Sender
bereitstellt (siehe Interface Beschreibung)Serializer
,
Deserializer
public void sendAllStreamData() throws java.lang.InterruptedException
Die Grundidee ist, dass alle Tickets an einer zentralen Stelle gesammelt werden. Dafür wurde als Datenstruktur eine Warteschlange gewählt. Diese synchronisiert sich selbständig und schickt wartende Threads automatisch in den wait Modus, gleichzeitig werden diese Threads wieder aufgeweckt, wenn neue Daten zur Verfügung stehen.
Sobald der Empfänger dem Sender eine Sendeerlaubnis erteilt wird der Stream mit seinem Index und der Anzahl Pakete, die er senden darf, in die Warteschlange eingetragen.
Wenn nun ein Stream gesucht wird, der senden soll, dann wird von der Warteschlange das vorderste Element angefordert. Es steht somit sofort ein Stream zur Verfügung. Gleichzeitig ist bekannt, wieviele Pakete dieser Stream verschicken darf.
java.lang.InterruptedException
- Ein Thread, der auf ein Objekt in der Warteschlange gewartet hat, wurde mit Interrupt
unterbrochen.public void setMaximumStreamTicketIndexForStream(byte[] streamTicketPacket) throws java.io.IOException
Diese Methode setzt den "maximumStreamTicketIndex" eines Streams herauf. Dadurch kann der Stream Datenpakete bis zu diesem neuen Index versenden. Wird der "maximumStreamTicketIndex" erreicht, stellt der Stream seine Sendetätigkeiten ein, bis der "maximumStreamTicketIndex" wieder erhöht wird. Verschickt der Empfänger eine "-1", dann will er die Empfangstätigkeiten auf diesem Stream einstellen.
Die ersten 4 Byte enthalten den Index des Streams. Die letzen vier Bytes enthalten den neuen maximalen Index. Dies ist eine Steuerung des einen Multis(Sender) durch den anderen(Receiver), kein Zugriff von außen.
streamTicketPacket
- Dieses Byte-Array enthält verschlüsselt den Index des Streams und den maximalen Index, bis
zu dem der StreamMultiplexer senden darf.java.io.IOException
- Ein Fehler beim deserialisieren von Datenpublic void killAllStreams()
Wenn das Objekt, dem der StreamMultiplexer gehört, einen Fehler des DaV gemeldet bekommt (die Leitung zur Empfängerapplikation wurde unterbrochen, als Beispiel) wird mit dieser Methode jeder Stream abgebrochen. Gleichzeitig wird die Sendeapplikation darauf hingewiesen, dass sie alle Nutzdaten für die Streams verwerfen kann. Auf der Gegenseite wird dem StreamDemultiplexer ebenfalls gemeldet, dass etwas mit der Verbindung nicht stimmt (dies übernimmt dort das Objekt, das den StreamDemultiplexer erzeugt hat). Der StreamDemultiplexer wird daraufhin ebenfalls alle Streams beenden. Der beidseitige Abbruch geschieht automatisch.