- Le constructeur sans paramètre TcpChannel( ) : crée seulement un canal client, et pas un canal serveur( voir MSDN). J’ajoute que c’est pour cette raison que vous ne précisez pas de numéro de port : le numéro de port n’a de sens que pour un canal serveur !(c’est le lieu de communication des données).
- Le constructeur TcpChannel( Int32) : crée un canal serveur qui écoute sur le port spécifié( voir MSDN). Ce constructeur est utilisé typiquement dans le cadre de l’application serveur. Mais il peut l’être aussi dans une application cliente, dans le cas( paragraphe ci-dessous) où on veut passer un objet du client en paramètre à une méthode distante.
J’ajoute que ce constructeur crée aussi un canal client, ce qui permet d’appeler les méthodes distantes de l’objet serveur, dans le cas d’un client qui s’est créé son channel ainsi pour pouvoir passer en paramètre un objet à une méthode distante(voir cas ci-dessous).
· Il est indispensable d’utiliser ce constructeur dans le cas d’un client qui va passer à une méthode distante un objet par référence. En effet, le client se comporte alors en serveur, et l’objet passé à la méthode devient un objet distant pour le serveur ! Un exemple vous est donné ci-dessous :
//ici on est obligé de préciser le numéro de port,
//pour pouvoir passer en paramètre un objet par référence, à une méthode distante: dans ce cas, on a besoin
//d'un canal serveur également
TcpChannel channel = new TcpChannel(1);
//Marche pas TcpChannel channel = new TcpChannel(); //ne marche pas ici,
//essayé!!!: server internal error ds ce client à l'exécution!!!
//mais marche dès lors que je ne passe pas d’objet en paramètre.
//Raison: notre objByRef passé, est donc un objet serveur,
//donc il nous faut un channel serveur, comme on fait pour
//n'importe quel objet serveur!!!
Remarque : si on avait déjà fait, dans la même application, un new TcpChannel( port), on ne pourra pas recréer un autre Channel(autre_port) : la raison est, à mon avis, qu’on ne peut pas créer 2 Channels serveur dans la même application. Dans ce cas, ne pas créer de Channel, tout simplement !( l’application saura d’elle-même qu’elle doit utiliser l’ancien Channel).
Autre remarque : il est créé, par la même occasion, un channel client, ce qui nous est indispensable pour appeler les méthodes distantes de l’objet serveur !
- Enfin reste un troisième constructeur TcpChannel (IDictionary, IClientChannelSinkProvider, IServerChannelSinkProvider), qui permet de préciser, au moment de la création du Channel, des propriétés de configuration. Celui-ci nous intéressera bientôt pour définit la configuration voulue au niveau sécurité.
N’oubliez pas, comme précisé sur le paragraphe « Précisions sur les channels », qu’il est indispensable de disposer d’un canal serveur, pour pouvoir passer un objet à une méthode distante. Il va vous falloir effectuer( dans ce cas de cet exemple, le numéro de port est 1 ) :
Mais n’oublions pas que le new TcpChannel( port ) va nous créer aussi un canal client, ce qui est toujours indispensable pour appeler une méthode distante !
b) Des directives de sécurité à donner pour pouvoir passer un objet de l’application cliente en paramètre
Quelques lignes sont nécessaires pour avoir le droit de désérialiser des ObjRef( des objets passés par référence, lors d’un appel de méthode distante d’un objet serveur). Les lignes suivantes proviennent de MSDN.
On se crée un objet provider avec une propriété TypeFilterLevel à Full. Puis on peut créer notre channel, en passant notamment notre provider au constructeur. Sans ces lignes, impossible de passer un objet par référence !
// On ne peut pas faire seulement TcpChannel channel = new TcpChannel(1069);
// car on a besoin d'avoir le droit de désérialiser des ObjRef.
//Donc on a besoin de demander le droit de faire ça!!!
// Creating a custom formatter for a TcpChannel sink chain.
BinaryServerFormatterSinkProvider provider = new BinaryServerFormatterSinkProvider();
provider.TypeFilterLevel = TypeFilterLevel.Full;
// Creating the IDictionary to set the port on the channel instance.
IDictionary props = new Hashtable();
props["port"] = 1069;
// Pass the properties for the port setting and the server provider in the server chain argument. (Client remains null here.)
TcpChannel channel = new TcpChannel(props, null, provider);