Serveur multi-client et client de chat en tcp avec authentification

Soyez le premier à donner votre avis sur cette source.

Vue 11 127 fois - Téléchargée 2 965 fois

Description

Bonjour, alors voici un petit projet sur lequel je travaille depuis 2 semaines, enfait, après avoir fini mon petit programme de morpion, j'ai voulu faire un petit programme de Chat, entre 2 personnes, alors que le programme était fait au quart, j'était bloqué sur l'utilisationdu controle Winsock à savoir si j'allais utiliser le TCP ou l'UDP, après avoir passé un bon moment à réfléchir sur les plus et les moins de chacun des protocole, l'inconvénient du TCP qui était d'avoir une connection établie pour communiquer, m'a donner l'idée de faire un Serveur de Chat.

Le fait d'avoir la connection active me permettait en fait de savoir si tel ou tel utilisateur était connecté, c'est alors que j'ai travaillé longuement sur ce projet avec beaucoup de misère vu que je ne connaissais très peu du controle Winsock, à savoir comment permettre plusieurs connections avec plusieurs clients de Chat avec un serveur, ce projet m'a permis d'apprendre énormément dessus :)
Le but recherché lors de l'écriture du code du serveur était alors d'avoir qu'un seul control Winsock sur la feuille et de travailler le code avec, en chargeant de nouveaux pour accepter les connections.

Alors que 1 semaine après le début du projet, j'avais sous les main un petit serveur de chat multi-client, qui permettait à plusieurs clients de se connecter et à communiquer entre eux, j'ai fais tester ce programme à un ami en lui demandant son avis, il m'a donné l'idée de faire une gestion des comptes utilisateurs, c'est alors que j'ai du complètement changer tous le code du client et du serveur dans la partie réception, pour que le client puisse se faire authentifier et le serveur puisse gérer une authentification pour l'acceptation de la connection et rajouter de nouvelles feuilles pour que le serveur gère les comptes utilisateurs. Ca a aussi permis de sécuriser le serveur à refuser toute tentative de connection d'un client inconnu, j'entends par la l'utilisation d'un programme pour se connecter à un serveur, le serveur réceptionnant des données très précises à traiter, dans le cas contraire fermera automatiquement la connection.

Il m'a aussi reproché d'avoir un menu assez désagréable à utiliser pour le peu de fonctions qu'il y avait, c'est alors que j'ai remplacé le menu par une ToolBar, mais alors que je reprochais la ToolBar de prendre trop de place pour mes petites icônes, j'ai décidé de virer la ToolBar par des boutons qui auraient la taille de mes icones, mon but premier était d'avoir une interface ou on verrait surtout le chat et non pas de gros boutons.
J'ai rajouté pour celà les ToolTipText pour vous aider à vous y retrouver

Par la suite mon collègue n'étant toujours pas satisfait... me reprocha que la police était trop petite, et qu'il manque de couleur, c'est là que m'ai venu l'idée d'utiliser le
contrôle RichText qui comme son nom l'indique est bcp plus riche en fonctionnalité,
l'inconvénient, je ne maitrisais pas du tout ce contrôle, et je l'ai surtout remarqué quand j'ai fais des tests de couleurs ou de taille de police, donc pendant 3-4 jours j'ai
longuement étudié comment pouvoir changer de polices et de taille sans perdre les anciennes informations.

J'ai longuement travaillé au niveau de l'interface pour en faire une utilisation très simple
et le plus chaud était à chaque fois que je rajoutais une nouvelle fonction au client, il
fallait que je modifie le code du Serveur et vice-versa, ce qui m'a fait arracher les
cheveux plus d'une fois, mais bon c'est le métier qui rentre me direz vous ;)

Donc pour finir, ça a donné naissance à 2 petits programmes, un Serveur et un client dont les fonctionnalitées sont :

Au niveau Client :
_ Sauvegarde de paramètres réseau, Login/Pass dans un fichier de config.cfg
_ Sauvegarde du Log dans un fichier Log.txt
_ Possiblité de changer la taille de la police
_ Possibilité de changer la Font, par rapport aux fonts disponibles dans le system
_ Intégration de la fonction /me
_ Gestion des couleurs en fonction du message
_ Possiblité de cacher ou non les personnes connectées au serveur

Au niveau serveur :
_ Gestion des membres autorisés pour la connection
_ Sauvegarde de paramètres réseau
_ Sauvegarde du Log dans un fichier Log.txt
_ Sauvegarde de la liste des membres du serveur dans un fichier Membres.cfg
_ Gestion des couleurs en fonction du message
_ Ajout de la fonction Kick d'un utilisateur

A venir :
_ Changement de taille et font sur le serveur
_ Control du champ Numéro de port sur le client et le serveur pour pas rentrer une donnée incorrecte

Pour éviter la surcharge en mémoire des Winsocks sur le serveur, j'ai du recodifier tout ça pour travailler sur des Index, le client n'aura qu'un seul Winsock, alors que le serveur, travaillera sur autant de winsocks que de clients connectés +1
Je me suis chargé à ce que les winsocks soient décharger de la mémoire lors d'une
déconnection d'un client ou d'un plantage d'un client ce qui permet d'éviter de consommer trop de mémoire après 10 h d'utilisation du serveur

Aujourd'hui j'ai fini de mettre à jour les commentaires des codes et surtout à intégrer le
contrôle RichText à la place du TextBox sur le serveur pour au moins gérer les nouvelles
fonctionnalités du Client

Les tests ont montré que sur 10 clients connectés le serveur est toujours stable sans aucun problèmes, théoriquement il peut accepter autant de clients que le contrôle Winsock le permet.

Enfin je vais arrêter là, c'est un programme à tester, si vous voulez savoir comment faire un petit serveur de chat multi client, les sources sont assez commentés pour vous aider

N'hésitez pas à faire des remarques ou des conseils, je débute en winsock, je fais avec les moyens du bord, je pense qu'il peut être possible de l'optimiser encore plus, même bien plus, pour ceux qui auront analysé mon code, si peuvent me toruver un autre moyen de modifier des informations dessus sans perdre les paramètres comme la police ou la taille, sans passer par une sauvegarde de la chaine avant le traitement ;)

Enfin vàla, j'attends vos commentaires :)

Conclusion :


Pour l'utilisation c'est très simple

Vous avez une liste de boutons en haut de la fenêtre principale :

Pour le Serveur :
_ Connecter/Déconnecter permet de mettre en route le serveur
_ Clear permet de nettoyer la fenêtre de chat
_ Log permet de voir le log des anciennes conversations
_ Membres, permet d'administrer les membres authorisés sur le serveur
_ Options permet de configurer le port d'écoute
_ Quitter
_ et About ;)

Sélectionnez un membre parmis les users online et click droit : permet de kicker ce membre

Pour le Client :
_ Connecter/Déconnecter permet de se connecter/déconnecter du serveur
_ Clear permet de nettoyer la fenêtre de chat
_ Log permet de voir le log des anciennes conversations
_ Membres permet de voir ou cacher les membres online
_ Options permet de configurer l'ip et le port du serveur, le pseudo et le mdp
_ Quitter
_ et About ;)

Faite un click droit sur la fenêtre de chat, permet de changer le Font et la Taille de la
police

Par défaut tous les messages venant du Programme ou de l'Administrateur du Serveur de chat seront en rouge à l'écran
Les messages des personnes connectées en bleu clair
Vos propres messages en noir

Sur le serveur comme sur le client vous pouvez utiliser le fonction : /me texte
comme sur msn ou irc, le message sera en vert

Valà j'espere que ce projet pourra aider des personnes à mieux comprendre l'utilisation du winsock

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
18
Date d'inscription
mardi 7 novembre 2000
Statut
Membre
Dernière intervention
9 avril 2007

Bonjour,
Tout d'abord bravo pour ce programme, il est vraiment superbe, bon boulot ! ;-)
Mais j'ai une question annexe (vous allez trouver ça stupide mais sachez que je suis nouveau dans le vb6 en réseau): le programme marche-t-il sur internet aussi où il ne marche qu'en réseau local?

Merci d'avance pour la réponse ! :-)
Et désolé de poser des questions de Newbie ! :-p
Messages postés
42
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
12 août 2008

Hello,
juste une petite réflection ... question propreté ... pour fermer la totalitée de test winsock un a un, au lieu de le décharger par rapport a ta liste de user ... tu ne ferrait pas mieux de le décharger par rapport au nombre de socket existant comme cela

r = wskTCP.UBound
For Index = 0 To r
...
Messages postés
28
Date d'inscription
mardi 27 janvier 2004
Statut
Membre
Dernière intervention
4 octobre 2005

Merci a Arkalis pour ce tres bon code!
j'ai fais aussi quelques modifs mais la je bloque, apparement avec TransfertData si index = 0 ca envoye a ts les clients! j'ai beau essayé de changer l'index ca bug.
Je voudrai pouvoir séléctionner le client et lui envoyer un mess a lui seul.
Est ce que quelqu'un a une idée sur le code a employer??

Merci et bonne continuation!
Messages postés
1
Date d'inscription
jeudi 25 avril 2002
Statut
Membre
Dernière intervention
3 juillet 2005

j'ai beaucoup appris de cette source, je l'ai bien analyser et j'ai recoder un client et un serveur de A à Z en me basant dessus
j'ai apporter pas mal de modifications (whisper une personne, faire un wizz comme sur msn pour réveiller une personne...) et principalement sur la structure des "packets" en séparant les valeurs par un caractère spécial à l'émission et en utilisant la fonction split à la réception ; ce qui simplifie grandement le code et me permet de mieux les gérer sans avoir a faire appel a des mid, left, right, len et j'en passe :)

un grand merci a Arkalis :)
Messages postés
1
Date d'inscription
mardi 1 février 2005
Statut
Membre
Dernière intervention
16 mai 2005

SVP pouvez-vous me dire comment faut-il faire pour télécharger l'exemple ?
Je vous remercie d'avance.
Cordialement.
Afficher les 8 commentaires

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.