1 pièce(s) jointe(s)
[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 :
http://www.developpez.net/forums/att...1&d=1210622237
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:
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:
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 :
Citation:
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:
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:
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:
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.