begin process at 2012 05 24 01:08:38
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseau & internet

 > MESSAGERIE SUR LE PRINCIPE CLIENT/SERVEUR

MESSAGERIE SUR LE PRINCIPE CLIENT/SERVEUR


 Information sur la source

Note :
9,5 / 10 - par 4 personnes
9,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Réseau & internet Classé sous :messagerie, serveur, reseau, python, threads Niveau :Débutant Date de création :19/04/2006 Date de mise à jour :19/04/2006 22:09:21 Vu :7 817

Auteur : MOY75

Ecrire un message privé
Site perso
Commentaire sur cette source (2)
Ajouter un commentaire et/ou une note

 Description

Normalement tout fonctionne, sauf qu'il faut paramétrer le HOST dans le client. Dans le code du serveur ce n'est pas nécessaire. On peut également modifier le port. Si vous êtes derrière un routeur, n'oubliez pas de router le port correspondant pour que les clients puissent se connecter au serveur.
Certes ce n'est graphiquement pas très beau mais c'est fonctionnel :D
C'est mon premier code, dites tout ce que vous avez à dire !

Source

  • #Serveur de messagerie pour systeme Unix créé par PGMSmurf alias MOY
  • # -*- coding: latin1 -*-
  • from socket import *
  • from sys import *
  • from threading import *
  • HOST = ''
  • PORT = 54725
  • print "\x1B[1;36;40]"
  • class ThreadClient(Thread):
  • #Gestion des connexions client#
  • def __init__(self, conn):
  • Thread.__init__(self)
  • self.connexion = conn
  • def run(self):
  • #Dialogue avec le Client
  • nom = self.getName() #Recuperation du nom du thread
  • msgClient = self.connexion.recv(1024)
  • #Gestion des pseudos
  • self.nick = msgClient[8:]
  • nick_dic[nom] = self.nick
  • print self.nick + " vient de se connecter !"
  • for clef in conn_client:
  • if clef != nom :
  • conn_client[clef].send(self.nick + " vient de se connecter !")
  • while 1:
  • msgClient = self.connexion.recv(1024)
  • if msgClient.upper() == '/QUIT' :
  • break
  • sys.exit()
  • message = self.nick + ": %s" % (msgClient)
  • print message
  • #Envoi du message à tous les clients
  • for cle in conn_client:
  • if cle != nom :
  • conn_client[cle].send(message)
  • #Fermeture de la connexion
  • self.connexion.close() #Plus de connexion cote serveur
  • del conn_client[nom] #Plus d'entree dans le dictionnaire
  • del nick_dic[nom]
  • print "Client %s déconnecté." % nom
  • #FIN DU THREAD
  • #Mise en place du socket
  • sock = socket(AF_INET, SOCK_STREAM)
  • try:
  • sock.bind((HOST, PORT))
  • except socket:
  • print "La connexion a échouée."
  • sys.exit()
  • print "Attente de connexions clientes"
  • sock.listen(100)
  • #Attente de connexions client
  • conn_client = {} #Creation du dictionnaire de connexion
  • nick_dic = {} #Creation du dictionnaire de pseudos en fonction de la connexion
  • while 1:
  • connexion, adresse = sock.accept()
  • #nouveau thread pour la connexion
  • th = ThreadClient(connexion)
  • th.start()
  • #Memorisation de la connexion dans le dictionnaire
  • id = th.getName() #nom du thread
  • conn_client[id] = connexion
  • #Enregistrement du nick
  • print "Client %s connecté, IP %s, port %s." % (id, adresse[0], adresse[1])
  • #Dialogue avec le client
  • connexion.send("Vous êtes connecté. Vous pouvez communiquer")
  • #Client Python adapté au serveur sus-cité créé par PGMSmurf alias MOY
  • # -*- coding: latin1 -*-
  • from socket import *
  • from sys import *
  • from threading import *
  • HOST = 'ip_du_serveur'
  • PORT = 54725
  • print "Entrez votre pseudo :"
  • nick = raw_input()
  • class ThreadReception(Thread):
  • #Gestion de la reception des messages#
  • def __init__(self, conn):
  • Thread.__init__(self)
  • self.connexion = conn #Socket de connexion
  • def run(self):
  • while 1:
  • message_recu = self.connexion.recv(1024)
  • if message_recu[-11:-2] == "connecter":
  • print "\x1B[1;32;40m"
  • print "*" + message_recu + "*"
  • print "\x1B[0;37;40m"
  • else:
  • print "\x1B[0;36;40m"
  • print "*" + message_recu + "*"
  • print "\x1B[0;37;40m"
  • if message_recu.upper() == nick + ': /QUIT' or message_recu == "":
  • break
  • sys.exit()
  • #Fin du thread de réception
  • #Forcer la fermueture du thread
  • th_R._Thread__stop()
  • print "Client arrêté, connexion imterrompue"
  • self.connexion.close()
  • class ThreadEmission(Thread):
  • #Emission de messages
  • def __init__(self, conn):
  • Thread.__init__(self)
  • self.connexion = conn #socket de connexion
  • def run(self):
  • while 1:
  • message_emis = raw_input()
  • if message_emis != "":
  • self.connexion.send(message_emis)
  • #Emission terminée
  • #Thread Principal
  • connexion = socket(AF_INET, SOCK_STREAM)
  • #Connexion au serveur :
  • try:
  • connexion.connect((HOST, PORT))
  • except socket:
  • print "La connexion a echouée"
  • sys.exit()
  • print "Connexion établie !"
  • connexion.send("nickname" + nick)
  • #connexion.send(nick + " vient de se connecter !")
  • #Lancement des threads
  • th_E = ThreadEmission(connexion)
  • th_R = ThreadReception(connexion)
  • th_E.start()
  • th_R.start()
#Serveur de messagerie pour systeme Unix créé par PGMSmurf alias MOY
# -*- coding: latin1 -*-

from socket import *
from sys import *   
from threading import *

HOST = '' 
PORT = 54725

print "\x1B[1;36;40]"

class ThreadClient(Thread): 
        #Gestion des connexions client#
        def __init__(self, conn):
                Thread.__init__(self)
                self.connexion = conn

        def run(self):
                #Dialogue avec le Client
                nom = self.getName()   #Recuperation du nom du thread
                msgClient = self.connexion.recv(1024)
                #Gestion des pseudos
                self.nick = msgClient[8:]
                nick_dic[nom] = self.nick
                print self.nick + " vient de se connecter !"
                for clef in conn_client:
                        if clef != nom :
                                conn_client[clef].send(self.nick + " vient de se connecter !")
                while 1:
                        msgClient = self.connexion.recv(1024)
                        if msgClient.upper() == '/QUIT' :
                                break
                                sys.exit()
                        message = self.nick + ": %s" % (msgClient)
                        print message
                        #Envoi du message à tous les clients
                        for cle in conn_client:
                                if cle != nom :
                                        conn_client[cle].send(message)
                #Fermeture de la connexion
                self.connexion.close()   #Plus de connexion cote serveur
                del conn_client[nom]     #Plus d'entree dans le dictionnaire
                del nick_dic[nom]
                print "Client %s déconnecté." % nom
                #FIN DU THREAD
#Mise en place du socket
sock = socket(AF_INET, SOCK_STREAM)
try:
        sock.bind((HOST, PORT))
except socket:
        print "La connexion a échouée."
        sys.exit()
print "Attente de connexions clientes"
sock.listen(100)
#Attente de connexions client
conn_client = {}    #Creation du dictionnaire de connexion
nick_dic = {}       #Creation du dictionnaire de pseudos en fonction de la connexion
while 1:
        connexion, adresse = sock.accept()
        #nouveau thread pour la connexion
        th = ThreadClient(connexion)
        th.start()
        #Memorisation de la connexion dans le dictionnaire
        id = th.getName()   #nom du thread
        conn_client[id] = connexion
        #Enregistrement du nick
        print "Client %s connecté, IP %s, port %s." % (id, adresse[0], adresse[1])
        #Dialogue avec le client
        connexion.send("Vous êtes connecté. Vous pouvez communiquer")

#Client Python adapté au serveur sus-cité créé par PGMSmurf alias MOY
# -*- coding: latin1 -*-

from socket import *
from sys import *
from threading import *

HOST = 'ip_du_serveur'
PORT = 54725

print "Entrez votre pseudo :"
nick = raw_input()

class ThreadReception(Thread):
        #Gestion de la reception des messages#
        def __init__(self, conn):
                Thread.__init__(self)
                self.connexion = conn #Socket de connexion

        def run(self):
                while 1:
                        message_recu = self.connexion.recv(1024)
                        if message_recu[-11:-2] == "connecter":
                                print "\x1B[1;32;40m"
                                print "*" + message_recu + "*"
                                print "\x1B[0;37;40m"
                        else:
                                print "\x1B[0;36;40m"
                                print "*" + message_recu + "*"
                                print "\x1B[0;37;40m"
                        if message_recu.upper() == nick + ': /QUIT' or message_recu == "":
                                break
                                sys.exit()
                #Fin du thread de réception
                #Forcer la fermueture du thread
                th_R._Thread__stop()
                print "Client arrêté, connexion imterrompue"
                self.connexion.close()
class ThreadEmission(Thread):
        #Emission de messages
        def __init__(self, conn):
                Thread.__init__(self)
                self.connexion = conn #socket de connexion
        def run(self):
                while 1:
                        message_emis = raw_input()
                        if message_emis != "":
                                self.connexion.send(message_emis)
        #Emission terminée

#Thread Principal
connexion = socket(AF_INET, SOCK_STREAM)
#Connexion au serveur :
try:
        connexion.connect((HOST, PORT))
except socket:
        print "La connexion a echouée"
        sys.exit()
print "Connexion établie !"
connexion.send("nickname" + nick)
#connexion.send(nick +  " vient de se connecter !")

#Lancement des threads
th_E = ThreadEmission(connexion)
th_R = ThreadReception(connexion)
th_E.start()
th_R.start()

 Conclusion

Un bug a été observé : lors d'une connexion par telnet sur le serveur, la commande /quit ne fonctionne pas et le serveur plante lorsque le terminal est fermé. Donc éviter ce mode de fonctionnement pour l'instant.
Je tenterai de mettre à jour ce code qui, à mon avis, est loin d'être achevé.
Si vous voulez des renseignements pgmsmurf@gmail.com
Pour ce qui est du niveau j'ai mis débutant par ignorance ...


 Historique

19 avril 2006 22:09:22 :
J'avais laissé mon ip dans la source ... peu sérieux non ?

 Sources de la même categorie

SOCKET MULTITHREAD SIMPLE par Guillamue06
TRANSFERT DE FICHIER PAR SOCKET par Guillamue06
Source avec une capture AUTO-FOLLOW/UNFOLLOW [TWITTER] EN [PERL] UTILISANT NET::TWIT... par GeroXXXX
Source avec Zip PINGEUR RÉSEAU par jeanbleo44
Source avec Zip Source avec une capture LISTING ET LOGS DES CONNEXIONS ET DECONNEXIONS DE MACHINES Q... par saigneurdushi

 Sources en rapport avec celle ci

Source avec Zip TPYCODE, TRADUCTEUR DE CODE par jonathan33350
Source avec une capture JEU DU SERPENT (SNAKE) par zarash
SIMPLE COMPARATEUR IPV4 EN PYTHON par erebos
Source avec Zip Source avec une capture RECOLTE D'INFO SUR UN SERVEUR! par V4mp
L'AUTRE FASSON DE VOIR LES THREADS par Marvin

Commentaires et avis

Commentaire de cumu le 12/06/2006 11:37:41

Salut

Ca marche niquel avec un serveur et un client.

Toutefois lorsque je lancer un autre client ca me met "Changement de la taille du dictionnaire durant l'execution ligne 26", du coté serveur

Est-ce que chez toi ca marche avec plusieurs clients ?

Commentaire de MOY75 le 10/12/2006 12:05:35

Excuse moi mais je n'ai pas eu internet pendant pas mal de temps.
J'avais essayé à l'époque avec plusieurs clients et ca avait marché.

Maintenant cela fait longtemps que je n'ai pas fait de python, et je suis entrain de m'y remettre.
Je me pencherai sur le problème et je te dirai.

Réponse tardive peut être inutile ...

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

serveur python et client visual basic [ par vinz973 ] bonjour je souhaite créer un serveur en python (socket) qui recoive des données d'une client en visual basic (winsock ) en TCP le probl Python er Threads [ par dirthangel ] Salut a tous je suis programmeur perl, j'aimerais savoir si les threads en python sont stable ? car c'est un vraie problème en Perl merci !!! Socket Python en SSL et Jabber [ par superzero93 ] Bonsoir à tousJ'ai installé un serveur XMPP Jabber sur une machine virtuelle Debian Lenny 32 bits (noyau 2.6.29 et sans interface graphique), et un cl comparaison adresse reseau [ par carlito84 ] Bonjour tout le monde, Voilà je dois écrire un script sur python qui me permette de comparer des adresses reseau entre elles du type: @1 = x1.x ip et reseau local [ par xilure ] comment en python peut on trouver l'adresse IP d'un PC ? cela pour faire un chat sur un reseau local du meme type que celui ci http://www.siteduzero.c serveur local redirigé vers page web [ par alix20 ] Bojour à tous,voilà, je suis complètement débutante en python (je découvre python grace à Swinnen) et j'ai une question qui semblera peut-être ridicul installation d'une base de données sur un serveur distant en utilisant Python et le CMS Mzalendo) [ par malaouii ] Bonjour, Comment peut on installer une base de données sur un serveur distant en utilisant Python et le CMS Mzalendo interface Python [ par abdousmi ] bjr tt le monde, j'ai un problème au niveau de saisir les caractères de tifinagh (Amazigh) dans une champs de texte d'une interface graphique creer Python et C++ [ par CoMpLeX ] Voila je souhaiterai interfacer une appli python et c++ de la manière suivante : Un script python que je lance depuis un programe c++, et qui se comp creer un executable python à faire fonctionner sous windows [ par marcus034 ] Bonjour, Nouvel utilisateur de python, je n'arrive pas à exécuter un script python  (créé sous idle de mandrake) sous windows


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 5,398 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales