Problème Socket / Bind dans un chat réseau en Python

Signaler
-
Messages postés
18
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
29 mai 2013
-
Bonjour tout le monde
Je ne me suis pas encore présenté, je suis nouveau sur le forum, et je débute seulement en python. Avec des amis, nous avons décidé de mettre trois PC en réseau (portant les adresses IP très originales 192.168.0.1, 192.168.0.2, et 192.168.0.3 ^^)

En regardant en peu à droite à gauche sur internet, nous avons décidé de programmer un chat en ligne fonctionnant au moins entre deux PC.
Sans plus attendre, je vous présente le premier programme, j'ai nommé, le programme numéro 1 :

Client :
import socket 
 
Sock =  socket.socket(socket.AF_INET,socket.SOCK_STREAM) # création du socket
Host = '192.168.0.1'
Port = 234
Sock.connect((Host,Port))

Sock2 = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
Host2 = '192.168.0.1'
Port2 = 500
Sock2.listen(1)
client, adresse = Sock2.accept()  # Creation du connecteur pour la reponse de ecoute.py
print ("L'adresse",adresse," vous a entendu et attend votre message.")

while 1:
        msgR = bytes(input('>> '), ('mac_roman'))  
        Sock.send(msgR)

        client, adresse = Sock2.accept() # accepte les connexions venant de l'exterieur
        print ("L'adresse",adresse,"vient de se connecter au serveur !")



Serveur
import socket

Sock  = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
Host =  '192.168.0.1' 
Port = 234
Sock.bind((Host,Port))

 
# On écoute (n) connexion(s)
Sock.listen(3)
 

client, adresse = Sock.accept() # accepte les connexions venant de l'exterieur
print ("L'adresse",adresse,"vient de se connecter au serveur !")


while 1:
        RequeteDuClient = client.recv(255) #255 caractères maximum
        if not RequeteDuClient: 
                break  
        print (">> Thomas : ",RequeteDuClient,"\a")




Voilà !

Jusque là, tout vas bien, même si un seul ordinateur peut envoyer des messages, le chat fonctionne nickel !
Nous avons donc continué en passant à la vitesse supérieur (toujours avec l'aide d'internet, bible de tout informaticien ^^) : programmer un chat dans lequel les deux PC peuvent envoyer et recevoir des messages.
(Vous remarquerez par contre que l'on est obligé d'attendre que l'autre ai finit de parler pour pouvoir parler à son tour )

Voilà donc notre programme numéro 2 !

Serveur
#!/usr/bin/python
# -*- coding: latin-1 -*-
import socket      # importe un ensemble d'instructions pour connecter les programmes.
                   # Cet ensemble est disponible a l'installation de Python, dans la bibliotheque de base.
 
# Creation du connecteur d'ecoute par l'instruction 'socket' 
# de la bibliotheque socket precedemment importee.
Connecteur  = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
 
Hote =  '192.168.0.1' # Adresse locale de l'ordinateur.
Port = 234          # Choix d'un port d'ecoute.
Connecteur.bind((Hote,Port)) # instruction 'bind' de la bibliotheque du connecteur
print ("Le programme est a l'ecoute d'une eventuelle discussion, vous en serez averti.") 
Connecteur.listen(1)                  # ecoute...
client, adresse = Connecteur.accept() # accepte...
print ("L'ordinateur",adresse," veut discuter ! J'attends son message.") 
 
# Creation du connecteur de reponse
Reponse = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
Port2 = 501
Reponse.connect((Hote,Port2))
print ("Note : je me suis connecte a",adresse," pour lui repondre") 
 
while 1:
        Message = str(client.recv(255),'mac_roman') # reception de la reponse, 255 caracteres max ;
        if not Message: 
                break  
        print ("\nMessage : ",Message,"\a" + "\n\nVotre reponse :") 
        msgR = bytes(input('>> '), ('mac_roman'))   # votre message ? 
        Reponse.send(msgR)        # envoi. 
 
client.close() # ferme la connexion lorsque le client est parti : [ctrl+C] pour abandonner l'execution du programme.



Client
#!/usr/bin/python
# -*- coding: latin-1 -*-
import socket

Discuter  = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
Hote = '192.168.0.1'
Port = 234
Port2 = 501
Discuter.connect((Hote,Port))       # Se connecte au programme ecoute.py
 
Reponse = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
Reponse.bind((Hote,Port2))
Reponse.listen(1)
client, adresse = Reponse.accept()  # Creation du connecteur pour la reponse de ecoute.py
print ("L'adresse",adresse," vous a entendu et attend votre message.")
while 1:
        msg = bytes(input('>> '), ('mac_roman'))  # votre message ? 
        Discuter.send(msg)      # envoi.
        print ("Attente de la reponse...")
        reponseaumessage = str(client.recv(255),'mac_roman') # reception de la reponse, 255 caracteres max ; 
        if not reponseaumessage:
                break  
        print ("\n",adresse,":",reponseaumessage,"\a\n")  # affiche la reponse 
 
client.close() # ferme la connexion lorsque le client quitte.


Voilou, ce programme 2 fonctionne parfaitement lorsque le client et le serveur sont lancés sur le même PC (mais ça n'a pas vraiment d’intérêt ^^), mais affiche un message d'erreur lorsque le programme est lancé sur deux PC. Celà m'ennui un peu car le programme 1 fonctionne bien en ligne et tout dans le réseau semble être correctement paramétré.
Il semblerait que ce soit un problème dû aux commandes bind...
Je débute seulement en python, mais j'aimerais bien que notre programme puisse fonctionner !
Merci d'avance à tous ceux qui pourront apporter leur aide !

1 réponse

Messages postés
18
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
29 mai 2013

Le forum étant peu fréquenté, je vous conseille de poster le problème sur un autre.

Je ne m'y connais pas très bien mais vous devriez repartir d'un autre exemple plus complet (multi-clients). Je pense que c'est le serveur qui devrait lancer toutes les socket (.bind).

Fred