IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Communication Foundation .NET Discussion :

[P2P] Problème de conception


Sujet :

Windows Communication Foundation .NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité1
    Invité(e)
    Par défaut [P2P] Problème de conception
    Bonjour,

    Je veux réaliser une DLL permettant à une application client de communiquer avec les autres clients via P2P. Je suis débutant avec WCF mais j'ai déjà réalisé quelques test de connexions grâce à PNRP qui ont d'ailleurs plutôt bien fonctionnés.

    En revanche cette fois je tombe sur un os en voulant créer la librairie qui me permettrait de faire la même chose. J'ai déjà consulté beaucoup de codes de chats P2P ou client/serveur utilisant WCF mais je n'arrive pas à résoudre mon problème.

    Voici le diagramme des classes de ce que j'ai déjà mis en place :



    Je veux donc réaliser une librairie qui me permettrait d'instancier un IClientChannel et d'implementer les méthodes interagissant avec l'interface utilisateur.

    Interface du service :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [ServiceContract(CallbackContract = typeof(ISocketCallback))]
    interface ISocketContract
    {
        // Méthodes
    }
     
    interface ISocketChannel : ISocketContract, IClientChannel
    {
    }
    Interface des callbacks :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [ServiceContract]
    public interface ISocketCallback
    {
        // Méthodes
    }
    En fait mon soucis apparaît au demarrage du channel. En effet un exception est levée dans ma méthode de connection avec le message d'erreur suivant :
    InstanceContext fourni à ChannelFactory contient un UserObject qui n’implémente pas CallbackContractType « TTO_Socket.ISocketCallback ».
    Méthode de connection de la classe d'implementation de l'interface du service :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public void Connect()
    {
        serviceContext = new InstanceContext(this);
    
        serviceBinding = new NetPeerTcpBinding("TTO_Net_Binding");
    
        serviceChannelFactory = new DuplexChannelFactory<ISocketChannel>(serviceContext, "TTO_Net_Endpoint");
        serviceChannel = serviceChannelFactory.CreateChannel();
    
        serviceStatusHandler = serviceChannel.GetProperty<IOnlineStatus>();
        serviceStatusHandler.Online += new EventHandler(OnOnline);
        serviceStatusHandler.Offline += new EventHandler(OnOffline);
    
        serviceChannel.InitializeConnection();
    }
    Alors je me suis logiquement dit que le problème provenait soit d'une erreur de conception soit d'une erreur de config dans mon fichier App.config

    App.config de l'appli hote :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <system.serviceModel>
        <client>
          <endpoint name="TTO_Net_Endpoint"
                    address="net.p2p://TTO_Socket/TTO_UI"
                    binding="netPeerTcpBinding"
                    bindingConfiguration="TTO_Net_Binding"
                    contract="TTO_Socket.ISocketContract">
          </endpoint>
        </client>
        <bindings>
          <netPeerTcpBinding>
            <binding name="TTO_Net_Binding" port="0">
              <resolver mode="Auto"/>
              <security mode="None"/>
            </binding>
          </netPeerTcpBinding>
        </bindings>
      </system.serviceModel>
    </configuration>
    Et enfin le code de l'appli hote :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public partial class TTO_Window : ISocketCallback
    {
        SocketService mysocket;
     
        public TTO_Window()
        {
            this.InitializeComponent();
            mysocket = new SocketService();
        }
     
        // Implémentation des callbacks
     
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            mysocket.Connect();
        }
    }

    Désolé si j'ai du autant mettre de citation de code mais je dois avouer que je suis un peu derouté et surtout je commence à douter que ma méthode de conception de bibliothèque soit la bonne. C'est pour cela que je viens vous demander conseil.

    Merci d'avance.

    Lionel.
    Images attachées Images attachées  
    Dernière modification par Invité1 ; 13/05/2008 à 00h13.

  2. #2
    Invité1
    Invité(e)
    Par défaut
    J'ai finalement trouvé réponse à mon problème en passant le bon contexte à mon channel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public void Connect(Object host)
    {
        serviceContext = new InstanceContext(host);
    
        serviceBinding = new NetPeerTcpBinding("TTO_Net_Binding");
    
        serviceChannelFactory = new DuplexChannelFactory<ISocketChannel>(serviceContext, "TTO_Net_Endpoint");
        serviceChannel = serviceChannelFactory.CreateChannel();
    
        serviceStatusHandler = serviceChannel.GetProperty<IOnlineStatus>();
        serviceStatusHandler.Online += new EventHandler(OnOnline);
        serviceStatusHandler.Offline += new EventHandler(OnOffline);
    
        serviceChannel.InitializeConnection();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public partial class TTO_Window : ISocketCallback
    {
        SocketService mysocket;
    
        public TTO_Window()
        {
            this.InitializeComponent();
            mysocket = new SocketService();
        }
    
        // Implémentation des callbacks
    
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            mysocket.Connect(this);
        }
    }
    Seulement à présent j'ai des soucis pour appeler les callbacks. Je pense donc avoir utiliser une mauvaise méthode.

    Je cherche un moyen de créer une classe avec des méthode à implémenter possédant aussi des méthodes déjà implementées. Classe que je pourrais également implementer à mon application principale (ici à la fenêtre) afin de pouvoir definir mes callbacks tout en ayant mes méthodes bas niveau déjà écrites. J'ai eu beau chercher comment faire mais je ne vois pas.

    Merci.

    Lionel.

Discussions similaires

  1. Méthode Finalize et problème de conception
    Par phryos dans le forum Langage
    Réponses: 4
    Dernier message: 19/04/2006, 11h04
  2. [VB6][UserControl et OCX]Problème de conception
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 19/01/2006, 22h37
  3. Petit problème de conception sur access
    Par coooookinette dans le forum Modélisation
    Réponses: 3
    Dernier message: 18/12/2005, 18h24
  4. Gestion des départements problème de conception
    Par snoopy69 dans le forum Modélisation
    Réponses: 7
    Dernier message: 11/10/2005, 13h08
  5. Problème de conceptions de tables
    Par dtavan dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 23/05/2004, 23h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo