private static class StreamDemultiplexer.DemultiplexerStreaminformations
extends java.lang.Object
Diese Objekt beinhaltet alle Informationen, die für einen Stream, auf Empfängerseite, wichtig sind. Diese Objekte werden in einem Array (Index des Arrays ist dabei gleich der Nummer des Stream) gespeichert. Somit können alle Inforamtionen zu einem Stream mit einem Arrayzugriff geholt werden
Modifier and Type | Field and Description |
---|---|
private UnboundedQueue |
_bigDataPacketQueue
In dieser Queue werden die großen Nutzdatenpakete gespeichert.
|
private boolean |
_endStream
Wenn der Sender keine Nutzdaten mehr für den Empfänger hat, dann wird der Stream beendet (dies sollte der Normalfall sein).
|
private int |
_indexOfStream |
private boolean |
_lostConnectionToSender
Bei der Übertragung der Daten ist ein Fehler aufgetreten.
|
private int |
_maxStreamPacketIndex
Bis zu welchem Paketindex darf der Sender Pakete versenden
|
private int |
_nextPacketIndex
Welchen Paketindex muß das nächste Paket haben.
|
private int |
_packetIndexToSendNextMaxTicketIndex
Wann muß das nächste Ticket zum Sender geschickt werden, damit er neue Nutzdatenpakete verschickt
|
private UnboundedQueue |
_smallDataPacketQueue
In dieser Queue werden die Nutzdaten gespeichert.
|
private boolean |
_streamAborted
Wenn ein Stream mit abort beendet wurde, dann geschieht dies durch den Empfänger (er will keine Nutzdaten mehr).
|
private boolean |
_streamTerminated
Bei der Übertragung der Daten ist ein Fehler aufgetreten, entweder wurde ein Nutzdatenpaket doppelt empfangen oder ein Paket fehlt.
|
Constructor and Description |
---|
DemultiplexerStreaminformations(int indexOfStream,
int packetIndexToSendNextMaxTicketIndex,
int maxStreamPacketIndex) |
Modifier and Type | Method and Description |
---|---|
void |
createUnlockPacket()
Es kann passieren, dass in der _bigDataPacketQueue Threads auf Daten warten (durch den take-Aufruf).
|
byte[] |
getData()
Diese Methode stellt die Nutzdaten des Streams zur Verfügung.
|
int |
getIndexOfStream()
Index des Streams
|
int |
getMaxStreamPacketIndex() |
int |
getNextPacketIndex() |
int |
getPacketIndexToSendNextMaxTicketIndex() |
StreamDemultiplexer.ReferenceDataPacket |
getReferenceDataPacket()
Diese Methode fordert ein Datenpaket des Streams an.
|
boolean |
isEndStream()
Wurde der Stream aufgrund fehlender Nutzdaten vom Sender beendet. true = ja, false = nein
|
boolean |
isLostConnectionToSender()
Wurde der Stream durch die Empfängerapplikation beendet, weil die physische Verbindung zur Senderapplikation unterbrochen wurde. true = ja, false = nein
|
boolean |
isStreamAborted()
Wurde der Stream vom der Empfängerapplikation beendet (aus welchen Gründen auch immer). true = ja, false = nein
|
boolean |
isStreamTerminated()
Wurde der Stream durch den Empfänger beendet, weil ein Paket doppelt vorhanden oder gar nicht vorhanden war. true = ja, false = nein
|
void |
newDataPacketForStream(StreamDemultiplexer.ReferenceDataPacket dataPacket)
Ein Datenpaket in einem Stream speichern (das Datenpaket muß mit take von der Applikation abgerufen werden, sonst steht es nicht zur Verfügung)
|
void |
putDataSmallDataPacketQueue(byte[] data)
Ein Nutzdatenpaket speichern, diese wird dann später an die Empfängerapplikation weiter gegeben.
|
void |
setEndStreamTrue()
Der Stream bei einem take Aufruf ein null-Paket zurück geliefert.
|
void |
setLostConnectionToSenderTrue()
Da die physische Verbindung zum Sender unterbrochen wurde, und somit keine Nutzdatenpakete mehr ankommen, können die restlichen Nutdaten auch gelöscht werden.
|
void |
setMaxStreamPacketIndex(int maxStreamPacketIndex) |
void |
setNextPacketIndex(int nextPacketIndex)
Der Index des Nutzdatenpakets, das als nächstes erwartet wird, wird hier neu gesetzt.
|
void |
setPacketIndexToSendNextMaxTicketIndex(int packetIndexToSendNextMaxTicketIndex) |
void |
setStreamAbortedTrue()
Der Stream wurde abgebrochen, es kann passieren, dass noch Threads in der _bigDataPacketQueue hängen und auf Daten warten.
|
void |
setStreamTerminatedTrue()
Da Fehlerhafte Nutzdatenpakete empfangen wurden, können alle empfangenen Nutzdatenpakete, die sich in der dataQueue befinden, verworfen werden.
|
int |
sizeOfDataQueue()
Diese Methode dient zum Debuggen.
|
int |
sizeOfSmallDataPacketQueue()
Bestimmt die Größe der Queue, die die Nutzdatenpakete für die Empfängerapplikation speichert.
|
private final int _indexOfStream
private int _packetIndexToSendNextMaxTicketIndex
Wann muß das nächste Ticket zum Sender geschickt werden, damit er neue Nutzdatenpakete verschickt
private int _maxStreamPacketIndex
Bis zu welchem Paketindex darf der Sender Pakete versenden
private int _nextPacketIndex
Welchen Paketindex muß das nächste Paket haben. Diese Variable soll verhindern, dass Pakete doppelt empfangen werden oder das Pakete “verschwinden”. Der default Wert ist 1, da das erste Paket den Index 1 hat.
private final UnboundedQueue _bigDataPacketQueue
In dieser Queue werden die großen Nutzdatenpakete gespeichert. Diese Pakete enthalten die kleinen Nutzdatenpakete und können somit nicht zur Empfängerapplikation weitergegeben werden, sondern müssen zuerst ausgepackt werden. Die kleinen Nutzdatenpakete werden dann an die Empfängerapplikation weitergegeben.
private final UnboundedQueue _smallDataPacketQueue
In dieser Queue werden die Nutzdaten gespeichert. Diese Pakete werden an die Empfängerapplikation weitergegeben.
private boolean _endStream
Wenn der Sender keine Nutzdaten mehr für den Empfänger hat, dann wird der Stream beendet (dies sollte der Normalfall sein). Diese Variable wird auf true gesetzt, wenn dieser Fall eintritt.
private boolean _streamAborted
Wenn ein Stream mit abort beendet wurde, dann geschieht dies durch den Empfänger (er will keine Nutzdaten mehr). Die Variable _streamAborted wird auf true gesetzt.
private boolean _streamTerminated
Bei der Übertragung der Daten ist ein Fehler aufgetreten, entweder wurde ein Nutzdatenpaket doppelt empfangen oder ein Paket fehlt. Dieser Fehler betrifft aber nur diesen einen Stream. Damit die Applaktion auf die fehlerhafte Datenleitung des einen Streams aufmerksam gemacht werden kann, wird diese Variable auf true gesetzt, dadurch kann eine ProtocolException ausgelöst.
private boolean _lostConnectionToSender
Bei der Übertragung der Daten ist ein Fehler aufgetreten. Der DaV meldet, dass ein Verbindungsproblem vorliegt. Dies betrifft alle Streams und alle Streams werden beendet. Dieser Fall erzeugt eine ClosedChannelException für alle Streams auf die ein take ausgeführt wird.
public DemultiplexerStreaminformations(int indexOfStream, int packetIndexToSendNextMaxTicketIndex, int maxStreamPacketIndex)
public int getPacketIndexToSendNextMaxTicketIndex()
public void setPacketIndexToSendNextMaxTicketIndex(int packetIndexToSendNextMaxTicketIndex)
public int getMaxStreamPacketIndex()
public void setMaxStreamPacketIndex(int maxStreamPacketIndex)
public int getNextPacketIndex()
public int getIndexOfStream()
Index des Streams
public void setNextPacketIndex(int nextPacketIndex)
Der Index des Nutzdatenpakets, das als nächstes erwartet wird, wird hier neu gesetzt.
public StreamDemultiplexer.ReferenceDataPacket getReferenceDataPacket() throws java.lang.InterruptedException
Diese Methode fordert ein Datenpaket des Streams an. Die Datenpakete werden in einer Queue gespeichert. Aus der Schlange wird das erste Paket zurück gegeben.
java.lang.InterruptedException
- Die Datenstruktur UnboundedQueue kann durch ein Interrupt unterbrochen werdenpublic void newDataPacketForStream(StreamDemultiplexer.ReferenceDataPacket dataPacket)
Ein Datenpaket in einem Stream speichern (das Datenpaket muß mit take von der Applikation abgerufen werden, sonst steht es nicht zur Verfügung)
dataPacket
- Ein Datenpaket (Definition: s.o.)public int sizeOfSmallDataPacketQueue()
Bestimmt die Größe der Queue, die die Nutzdatenpakete für die Empfängerapplikation speichert. Ist die Größe “0”, dann muss ein großes Paket ausgepackt werden.
public void putDataSmallDataPacketQueue(byte[] data)
Ein Nutzdatenpaket speichern, diese wird dann später an die Empfängerapplikation weiter gegeben.
data
- Ein Nutzdaten für die Empfängerapplikationpublic byte[] getData() throws java.lang.InterruptedException
Diese Methode stellt die Nutzdaten des Streams zur Verfügung. Dieser Zugriff wird nur dann ausgeführt, wenn vorher überprüft wurde, ob überhaupt Nutzdaten vorhanden sind (Methode: sizeOfSmallDataPacketQueue
).
java.lang.InterruptedException
public boolean isEndStream()
Wurde der Stream aufgrund fehlender Nutzdaten vom Sender beendet. true = ja, false = nein
public boolean isStreamAborted()
Wurde der Stream vom der Empfängerapplikation beendet (aus welchen Gründen auch immer). true = ja, false = nein
public boolean isStreamTerminated()
Wurde der Stream durch den Empfänger beendet, weil ein Paket doppelt vorhanden oder gar nicht vorhanden war. true = ja, false = nein
public boolean isLostConnectionToSender()
Wurde der Stream durch die Empfängerapplikation beendet, weil die physische Verbindung zur Senderapplikation unterbrochen wurde. true = ja, false = nein
public void setEndStreamTrue()
Der Stream bei einem take Aufruf ein null-Paket zurück geliefert. Somit hatte die Senderapplikation keine Nutzdaten mehr und hat den Stream auf ihrer Seite bereits beendet. Der StreamDemultiplexer kann seinen Stream ebenfalls beenden.
public void setStreamAbortedTrue()
Der Stream wurde abgebrochen, es kann passieren, dass noch Threads in der _bigDataPacketQueue hängen und auf Daten warten. Diese müßen künstlich befreit werden, in dem “unlockPackets” erzeugt werden. Diese Datenpakete enthalten keine Daten werden aber in die _bigDataPacketQueue aufgenommen und befreien somit einen Thread.
public void setStreamTerminatedTrue()
Da Fehlerhafte Nutzdatenpakete empfangen wurden, können alle empfangenen Nutzdatenpakete, die sich in der dataQueue befinden, verworfen werden. Falls noch Threads auf Daten warten, müßen diese befreit werden (Erklärung, siehe “setStreamAbortedTrue”).
public void setLostConnectionToSenderTrue()
Da die physische Verbindung zum Sender unterbrochen wurde, und somit keine Nutzdatenpakete mehr ankommen, können die restlichen Nutdaten auch gelöscht werden. Falls noch Threads auf Daten warten, müßen diese befreit werden (Erklärung, siehe “setStreamAbortedTrue”).
public void createUnlockPacket()
Es kann passieren, dass in der _bigDataPacketQueue Threads auf Daten warten (durch den take-Aufruf). Wenn nun der Stream unterbrochen/beendet wird, dann kommen keine Pakete mehr. Die Threads warten also vergebens in der _bigDataPacketQueue. Damit diese Threads nun befreit werden können, werden “Unlock Packets” erzeugt. Diese enthalten keine Nutzdaten und jedes Paket befreit genau einen Thread aus der _bigDataPacketQueue. Der Thread wird dann mit dem “UnlockPacket” weiterarbeiten. Sobald er aber an die Stelle kommt an der der Zustand des Streams getestet wird (take Methode, synchronized(stream), if-Abfragen), wird eine Exception geworfen (der Stream wurde ja unterbrochen/beendet, also darf er nichts mehr senden). Diese Pakete sind also nur ein Trick um “hängende” Threads aus der dataQueue zu befreien.
Jeder Thread, der eine Exception auslösen wird (mit throws Exception), wird vorher diese Methode aufrufen.
public int sizeOfDataQueue()
Diese Methode dient zum Debuggen. Sie liefert die größe (Anzahl Objekte) der Queue zurück. Ist die Anzahl der eingetragenen Elemente größer als der _deblockingFactor, dann ist ein Fehler aufgetreten. (Der Sender überlastet den Empfänger)