badboy38
Messages postés95Date d'inscriptionvendredi 14 janvier 2005StatutMembreDernière intervention 4 mars 2013
-
1 déc. 2012 à 15:02
madkeyboard
Messages postés100Date d'inscriptionmercredi 27 avril 2011StatutMembreDernière intervention21 décembre 2012
-
18 déc. 2012 à 11:22
Bonjour à tous et merci de prendre le temps de lire ce post.
Je suis en train de réaliser une application multi-client / multi-serveur (par réseau TCP) ayant un cahier des charges très contraignant. J'aurais besoin de vos avis pour utiliser la meilleure solution technique.
Voici la situation:
Chaque client génère des informations à transmettre au(x) serveur(s) en fonctions des données entrées par l'utilisateur. Ces données sont alors traitées par le(s) serveur(s) puis injectées dans une base de données
Cahier des charges:
- Les informations à envoyer doivent être stockées de façon persistante, au niveau du client avant l'envoi et au niveau du serveur après la réception.
- Dans le client, les informations déjà envoyées doivent être conservées à des fins d'archivage.
- Dans le serveur, les informations déjà traitées doivent être conservées dans le même but.
- Les clients ne peuvent pas avoir de bases de données.
La communication TCP est déjà au point. J'ai prévu d'utiliser une file (System.Collections.Generic.Queue) pour stocker les données à envoyer / reçue pour avoir un accès plus rapide, mais la persistance et l'archivage me posent problème.
La sérialisation me paraît être une solution à la persistance mais ne permet pas l'archivage directement...
Ma question est donc: comment réaliser la persistance et l'archivage?
BadBoy38
yann_lo_san
Messages postés1137Date d'inscriptionlundi 17 novembre 2003StatutMembreDernière intervention23 janvier 201626 1 déc. 2012 à 21:24
Salut,
Une solution serait d'utiliser le transit par socket d'objets structuré et serialisable, les mêmes objets pourraient être utilisés avec la serialisatin XML.
Pour la serialisation XML,
Faire un schéma XSD de la structure des messages
Passer le schéma XSD à l'outil XSD.EXE afin de générer un proxy Csharp
Les classes auront les attributs xml comme par exemple
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://tempuri.org/")]
public partial class MessageData { /*...*/ }
3 : Intégrer le proxy (classes serialisables) dans son projet
4 : Faire 2 fonctions SerializeObj et DeserialyzeObj
Utiliser les objets suivants
XmlSerializer serializer = new XmlSerializer(objToSerialize.GetType());
serializer.Serialize(output, objToSerialize);
Utiliser un XmlDocument et la fonction "Save" vers une hiérarchie de répertoire de stockage (RACINE\JJ_MM_AAAA) par exemple
VOilà pour l'archivage.
Il sera facile de récupérer un fichier archivé, de le serialiser et de le renvoyer par TcpIP
Ce qui règle la "persistance"
Utiliser une classe de même structure pour faire transiter les objets par TCPIP sans les attributs de serialisation XML
[Serializable]
public class MessageData
{
/*....*/
}
TcpClient client = new TcpClient();
NetworkStream clientStream = null;
MessageData data = new MessageData(/*...*/);
/*...*/
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(clientStream, data);
J'aurais aussi utilisé le service MSMQUEUE de windows, facilement gérable depuis C# avec l'objet :
System.Messaging.MessageQueue;
Et là, l'architecture serait d'autant plus élégante.