Service: Kanaallisteners en -kanalen
Er zijn drie categorieën kanaalobjecten: kanalen, kanaallisteners en kanaalfactory's. Kanalen zijn de interface tussen de toepassing en de kanaalstack. Kanaallisteners zijn verantwoordelijk voor het maken van kanalen aan de ontvangstzijde (of listen), meestal als reactie op een nieuw binnenkomend bericht of een nieuwe verbinding. Kanaalfactory's zijn verantwoordelijk voor het maken van kanalen aan de verzendzijde om communicatie met een eindpunt te initiëren.
Kanaallisteners en -kanalen
Kanaallisteners zijn verantwoordelijk voor het maken van kanalen en het ontvangen van berichten van de laag onder of van het netwerk. Ontvangen berichten worden bezorgd in de bovenstaande laag met behulp van een kanaal dat is gemaakt door de kanaallistener.
Het volgende diagram illustreert het proces van het ontvangen van berichten en het bezorgen ervan aan de bovenstaande laag.
Een kanaallistener ontvangt berichten en levert via kanalen aan de bovenliggende laag.
Het proces kan conceptueel worden gemodelleerd als een wachtrij binnen elk kanaal, hoewel de implementatie mogelijk geen wachtrij daadwerkelijk gebruikt. De kanaallistener is verantwoordelijk voor het ontvangen van berichten van de laag onder of het netwerk en het plaatsen ervan in de wachtrij. Het kanaal is verantwoordelijk voor het ophalen van berichten uit de wachtrij en het doorgeven aan de laag erboven wanneer die laag om een bericht vraagt, bijvoorbeeld door het kanaal aan te roepen Receive
.
WCF biedt basisklasse-helpers voor dit proces. Zie Overzicht van kanaalmodellen voor een diagram van de kanaalhulpklassen die in dit artikel worden besproken.
De CommunicationObject klasse implementeert en dwingt ICommunicationObject de statusmachine af die wordt beschreven in stap 2 van Het ontwikkelen van kanalen.
De ChannelManagerBase klasse implementeert CommunicationObject en biedt een uniforme basisklasse voor ChannelFactoryBase en ChannelListenerBase. De ChannelManagerBase klasse werkt in combinatie met ChannelBase, een basisklasse die wordt geïmplementeerd IChannel.
De ChannelFactoryBase klasse implementeert ChannelManagerBase en IChannelFactory consolideert de
CreateChannel
overbelastingen in éénOnCreateChannel
abstracte methode.De ChannelListenerBase klasse implementeert IChannelListener. Het zorgt voor basisstatusbeheer.
De volgende discussie is gebaseerd op het voorbeeld Transport: UDP .
Een kanaallistener maken
Het UdpChannelListener
voorbeeld dat door het voorbeeld wordt geïmplementeerd, is afgeleid van de ChannelListenerBase klasse. Er wordt één UDP-socket gebruikt om datagrammen te ontvangen. De OnOpen
methode ontvangt gegevens met behulp van de UDP-socket in een asynchrone lus. De gegevens worden vervolgens geconverteerd naar berichten met behulp van het berichtcoderingssysteem:
message = UdpConstants.MessageEncoder.ReadMessage(
new ArraySegment<byte>(buffer, 0, count),
bufferManager
);
Omdat hetzelfde datagramkanaal berichten vertegenwoordigt die afkomstig zijn van een aantal bronnen, is het UdpChannelListener
een singleton-listener. Er is maximaal één actief IChannel gekoppeld aan deze listener tegelijk. Het voorbeeld genereert alleen nog een kanaal als een kanaal dat door de AcceptChannel methode wordt geretourneerd, vervolgens wordt verwijderd. Wanneer een bericht wordt ontvangen, wordt het in dit singleton-kanaal geplaatst.
UdpInputChannel
De UdpInputChannel
klasse implementeert IInputChannel. Het bestaat uit een wachtrij met binnenkomende berichten die worden gevuld door de socket van de UdpChannelListener
. Deze berichten worden door de Receive methode in de wachtrij geplaatst.