Tjänst: Kanallyssnare och kanaler
Det finns tre kategorier av kanalobjekt: kanaler, kanallyssnare och kanalfabriker. Kanaler är gränssnittet mellan programmet och kanalstacken. Kanallyssnare ansvarar för att skapa kanaler på mottagarsidan (eller lyssna), vanligtvis som svar på ett nytt inkommande meddelande eller en ny anslutning. Kanalfabriker ansvarar för att skapa kanaler på sändningssidan för att initiera kommunikation med en slutpunkt.
Kanallyssnare och kanaler
Kanallyssnare ansvarar för att skapa kanaler och ta emot meddelanden från lagret nedan eller från nätverket. Mottagna meddelanden levereras till lagret ovan med hjälp av en kanal som skapas av kanallyssnaren.
Följande diagram illustrerar processen för att ta emot meddelanden och leverera dem till lagret ovan.
En kanallyssnare tar emot meddelanden och levererar till lagret ovan via kanaler.
Processen kan modelleras konceptuellt som en kö i varje kanal, även om implementeringen kanske inte använder en kö. Kanallyssnaren ansvarar för att ta emot meddelanden från lagret nedan eller nätverket och placera dem i kön. Kanalen ansvarar för att hämta meddelanden från kön och överlämna dem till lagret ovan när det lagret frågar efter ett meddelande, till exempel genom att anropa Receive
på kanalen.
WCF tillhandahåller basklasshjälp för den här processen. Ett diagram över kanalhjälpklasserna som beskrivs i den här artikeln finns i Översikt över kanalmodell.
Klassen CommunicationObject implementerar ICommunicationObject och tillämpar tillståndsdatorn som beskrivs i steg 2 i Utveckla kanaler.
Klassen ChannelManagerBase implementerar CommunicationObject och tillhandahåller en enhetlig basklass för ChannelFactoryBase och ChannelListenerBase. Klassen ChannelManagerBase fungerar tillsammans med ChannelBase, vilket är en basklass som implementerar IChannel.
Klassen ChannelFactoryBase implementerar ChannelManagerBase och IChannelFactory konsoliderar överbelastningarna
CreateChannel
till enOnCreateChannel
abstrakt metod.Klassen ChannelListenerBase implementerar IChannelListener. Den tar hand om grundläggande tillståndshantering.
Följande diskussion baseras på exemplet Transport: UDP .
Skapa en kanallyssnare
Det UdpChannelListener
som exemplet implementerar härleds från ChannelListenerBase klassen. Den använder en enda UDP-socket för att ta emot datagram. Metoden OnOpen
tar emot data med UDP-socketen i en asynkron loop. Data konverteras sedan till meddelanden med hjälp av meddelandekodningssystemet:
message = UdpConstants.MessageEncoder.ReadMessage(
new ArraySegment<byte>(buffer, 0, count),
bufferManager
);
Eftersom samma datagramkanal representerar meddelanden som kommer från ett antal källor är UdpChannelListener
det en singleton-lyssnare. Det finns högst en aktiv IChannel som är associerad med den här lyssnaren i taget. Exemplet genererar endast en annan om en kanal som returneras av AcceptChannel metoden sedan tas bort. När ett meddelande tas emot placeras det i den här singleton-kanalen.
UdpInputChannel
Klassen UdpInputChannel
implementerar IInputChannel. Den består av en kö med inkommande meddelanden som fylls i av socketen UdpChannelListener
. Dessa meddelanden är dequeued av Receive metoden.