Netaccess 2.0 rc2 : librairie pour application clients/serveur

Description

NetAccess est un librairie fournissant une méthode d'implémentation d'application client/serveur utilisant le protocole TCP.
La librairie se charge elle même de la gestion de clients, des socket et de toutes les données relative à la communication.

L'intégration de ce système est extrêmement simple puisqu'il vous suffit de créer une classe dans votre application dérivant l'une des deux classe abstraite (NetAccess.Client.ClientManager ou NetAccess.Server.ServerManager).

Parmi les fonctionnalitées de cette version 2 :
-> Possibilité de compression des transmission en utilisant l'algorithme GZip
-> Gestion de la capacité du serveur (en nombre de client)
-> possibilité à l'application de refuser la connexion d'un client
-> vérification de la compatibilité du client et du serveur
-> Ping

Nouveauté de la béta 2
-> Log avec différent niveau de rapport (les log sont désormais basé sur la librairie externe log4net disponible ici : http://logging.apache.org/log4net/)
-> Cryptage des transactions à la demande utilisant du RSA combiné avec Rijndael
-> Meilleur gestion des clients (expulsion avec message,...)
-> Possibilité d'indiquer un message envoyé au client automatique lors de l'arrêt du serveur.
-> Réécriture du système d'envoi/réception des messages pour une montée en charge bien meilleur (correction des mauvaises transmissions lors de la transmission de beaucoup de paquet en peu de temps | prise en charge des données dépassant la taille du buffer)

Des exemples d'implémentation seront fournit par la suite.

=====================================

Je viens de mettre à jour la source vers une nouvelle version qui corrige quelques éléments. Voici le changelog :

 Ajout de la configuration « string ServerConfiguration.StringServerPrivateKey » pour le serveur.
 Ajout de la configuration « string ClientConfiguration.StringServerPublicKey « pour le client.
 Ajout de la méthode « string EncryptionManager.ConvertKeyToString(byte[] key) ».
 Ajout de la méthode « byte[] EcryptionManager.ConvertKeyFromString(string key) ».
 Correction du bug #001.
 Correction du bug #002.
 Correction du bug #003.
 Correction du bug #004.
 Correction du bug #005.
 Ajout de l'évènement StateChanged sur le serveur lancé à chaque changement d'état du serveur.
 Correction du bug #006.
 Correction du bug #007 (l'utilisation de "return" dans la boucle de traitement empêchait l'analyse de tout les packets).
 Passage du tableau de client de HybridDictionnary en Dictionnary<int, Client> afin d'améliorer les performances.
 Passage de l'id client en type Int32 afin d'améliorer les performances.
 Ajout de la méthode SendToRange(ICollection<int> listClient, NetworkPacket packet, bool crypt) permettant d'envoyer un packet à une liste de client.
 Le méthode ClientManager.Close() à été renommée en ClientManager.Disconnect().
 Correction du bug #008.
 Ajout de l'évènement StateChanged sur le client lancé à chaque changement d'état du client.
 ServerManager.Start() transmet maintenant les exceptions lancé durant le démarage à l'application principale.
 Ajout d'une surcharge sur le constructeur de NetworkPakcket : new NetworkPacket(object type, params object[] data)
 Ajout de ServerManager.GetIpEndPointFromId(int clientId)
 Ajout de ServerManager.GetClientIdFromIP(IPAddress ip)

=====================================
A propos de la mise à jour du 4 mars 2008.
C'est ici la version avant publication des sources. Aucune modification d'interface ou de fonctionnalité ne sera fait d'ici la version release.

La dll log4net est fournit dans les sources (log4net.dll.rename à renommé en log4net.dll).
=====================================
/!\ ATTENTION /!\
Cette source utilise le framework 3.5; La solution quand à elle provient de Visual Studio 2008 dont la version C# Express est disponible ici : http://www.microsoft.com/express/vcsharp/Default.aspx

Conclusion :


La version des sources est actuellement une version RC1.
Vous pouvez retrouver la page du projet sur : http://www.codeplex.com/NetAccess (attention actuellement seule la version 1.0 est actuellement publiée sur codeplex)

=====================================
-= BUG =-

? #001 : Un cas non traité lors de l?écriture du packet provoquait une exception.
? #002 : Une exception peut être levée en cas de déconnexion du client juste après une réception. Cette erreur était du à une mauvaise condition sur un test (sans test préalable de nullité).
? #003 : Une exception pouvait être lancée lors de la fermeture des handle sécurisé si ceux-ci était encore en écoute.
? #004 : Une exception peu indicative apparaissait lorsque qu'un hôte inexistant ou introuvable était passé en paramètre IP du client.
? #005 : Une erreur se produisait lorsque l?on tentait de fermer le client sans s?être connecté à un serveur.
? #006 : Une erreur pouvait se produire au niveau de l'écoute des clients entrants lorsque le serveur était disposé.
? #007 : Lors de la réception de plusieurs packet dans un délai très court, seul le premier packet était traité (alors que les suivants était correctement reçu)
? #008 : Lors de la déconnection, l'autoresetevent du ping était fermer et n'était pas réouvert en cas de reconnexion

=====================================
-= FAQ =-

(si vous avez d'autres question n'hésitez pas à les posez en commentaires)

-> pourquoi avoir fait une nouvelle source?
La librairie étant complètement réécrite et réorganisé, j'ai choisi de la présenter comme une nouvelle source. De plus la compatibilité avec la version n'a pu être assurée.

-> Pourquoi poster une source non terminée?
J'ai posté cette source avec deux objectif : la faire partager pour permettre au personne le souhaitant d'étudier le fonctionnement des socket mais aussi afin d'obtenir un retour sur le fonctionnement, la stabilité et les éventuel problèmes rencontrés lors de l'implémentation (en vue de la création d'une doc).

-> Faut-il être expert (niveau de la source) pour utiliser la librairie?
Non pas du tout. La librairie à été conçu avec pour objectif de fournir une implémentation la plus simple possible. Le niveau Expert de la librairie correspond plutôt au niveau de son code source interne intégrant des socket, du multi-thread, des technique particulière de lancement d'évènement, de l'abstraction, du cryptage,...

-> Comment activer le cryptage?
Pour activer le cryptage vous devez dans un premier temps générer un couple clef public/privé pour le serveur (Une méthode est prévu à cette effet : NetAccess.EncryptionManager.GenerateKeyPair(out byte[] publicKey, out byte[] privateKey) ). En suite voud devez paramétrer votre serveur Server en activant UseEncryption et en renseignant le champs ServerPrivateKey. Enfin vous devez paramétrer votre client en activant UseEncryption et en renseignant ServerPublicKey. Ensuite pour faire un envoi crypter utilisé la méthode send avec le paramètre "crypt" à true.

=====================================
Information Complémentaire : s'agissant d'une version béta je vous serait reconnaissant de me faire remonter toutes erreurs, exceptions, soucis, avis,... afin de pouvoir obtenir une version final la plus stable possible.

=====================================
Evolution future : pour la version 2.1 j'intégrerais la possibilité d'utiliser UDP pour certaine transaction (ainsi l'utilisation de NetAccess dans les jeux vidéo nécessitant la transmission de certain type de message de façon très fréquente : refresh de position; sera amélioré). Bien entendu cette amélioration ne se limite pas au seul domaine du jeu vidéo puisque d'autre type d'application pourront y trouver leur compte.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.