Usługa: odbiorniki kanału i kanały
Istnieją trzy kategorie obiektów kanałów: kanały, odbiorniki kanałów i fabryki kanałów. Kanały to interfejs między aplikacją a stosem kanału. Odbiorniki kanału są odpowiedzialne za tworzenie kanałów po stronie odbierania (lub nasłuchiwania), zazwyczaj w odpowiedzi na nowy przychodzący komunikat lub połączenie. Fabryki kanałów są odpowiedzialne za tworzenie kanałów po stronie wysyłania w celu zainicjowania komunikacji z punktem końcowym.
Odbiorniki kanału i kanały
Odbiorniki kanału są odpowiedzialne za tworzenie kanałów i odbieranie komunikatów z warstwy poniżej lub z sieci. Odebrane komunikaty są dostarczane do powyższej warstwy przy użyciu kanału utworzonego przez odbiornik kanału.
Na poniższym diagramie przedstawiono proces odbierania komunikatów i dostarczania ich do powyższej warstwy.
Odbiornik kanału odbiera komunikaty i dostarcza do warstwy powyżej za pośrednictwem kanałów.
Proces można modelować koncepcyjnie jako kolejkę wewnątrz każdego kanału, chociaż implementacja może nie używać kolejki. Odbiornik kanału jest odpowiedzialny za odbieranie komunikatów z warstwy poniżej lub sieci i umieszczanie ich w kolejce. Kanał jest odpowiedzialny za pobieranie komunikatów z kolejki i przekazywanie ich do warstwy powyżej, gdy ta warstwa prosi o komunikat, na przykład przez wywołanie Receive
kanału.
Program WCF udostępnia pomocników klasy bazowej dla tego procesu. Aby zapoznać się z diagramem klas pomocnika kanału omówionych w tym artykule, zobacz Channel Model Overview (Omówienie modelu kanału).
Klasa CommunicationObject implementuje ICommunicationObject i wymusza maszynę stanu opisaną w kroku 2 kanałów programowania.
Klasa ChannelManagerBase implementuje CommunicationObject i udostępnia ujednoliconą klasę bazową dla elementów ChannelFactoryBase i ChannelListenerBase. Klasa ChannelManagerBase działa w połączeniu z klasą ChannelBase, która jest klasą bazową, która implementuje IChannelelement .
Klasa ChannelFactoryBase implementuje ChannelManagerBase i IChannelFactory konsoliduje
CreateChannel
przeciążenia w jednąOnCreateChannel
metodę abstrakcyjną.Klasa ChannelListenerBase implementuje IChannelListenerelement . Zajmuje się podstawowym zarządzaniem stanem.
Poniższa dyskusja opiera się na przykładzie Transport: UDP .
Tworzenie odbiornika kanału
Przykład UdpChannelListener
implementuje pochodną ChannelListenerBase klasy . Używa pojedynczego gniazda UDP do odbierania datagramów. Metoda OnOpen
odbiera dane przy użyciu gniazda UDP w pętli asynchronicznej. Dane są następnie konwertowane na komunikaty przy użyciu systemu kodowania komunikatów:
message = UdpConstants.MessageEncoder.ReadMessage(
new ArraySegment<byte>(buffer, 0, count),
bufferManager
);
Ponieważ ten sam kanał datagramu reprezentuje komunikaty pochodzące z wielu źródeł, UdpChannelListener
jest to pojedynczy odbiornik. W danym momencie istnieje co najwyżej jeden aktywny IChannel skojarzony z tym odbiornikiem. Przykład generuje inny tylko wtedy, gdy kanał zwracany przez metodę AcceptChannel jest następnie usuwany. Po odebraniu komunikatu jest on umieszczany w kolejce do tego kanału pojedynczego.
UdpInputChannel
Klasa UdpInputChannel
implementuje IInputChannelelement . Składa się z kolejki komunikatów przychodzących wypełnianych przez UdpChannelListener
gniazdo . Te komunikaty są dequeued przez metodę Receive .