Bonjour à tous.
Je suis nouveau dans Python, même si je connais bien Java ou le c#.
Je souhaite établir un relais TCP-IP entre des machines distantes, et un utilisateur (je me limite à un pour le moment)

Je vous explique mon petit soucis :

Petite particularité, les machines et l'utilisateur n'accepent pas les connexions entrantes. C'est donc eux qui doivent initier la connexion.

Paramètres obligatoires dans mon cas :

- il peut y avoir une multitude de machines
- il y a un utilisateur
- les machines et l'utilisateur doivent pouvoir se connecter et se déconnecter quand bon leur semble. (en effet, mes "machines" seront à termes équipées d'un modem GPRS, donc la connexion continue sera utile )
- tout message provenant de l'utilisateur est envoyé à toutes les machines
- tout message provenant d'un modem est envoyé à l'utilisateur (avec identification de la machine en question, afin que l'on sache d'ou il provient)

Mon script de connexion côté machine est écrit et fonctionnel, il se connecte au serveur, et à partir de ce moment on peut en faire ce qu'on veut ( c'est en fin de compte un script de connexion modem GPRS qui est lié au serveur).

La ou j'ai un petit soucis, c'est au niveau du script serveur et script utilisateur.
En effet, l'utilisateur se connecte, mais je n'arrive pas à envoyer de mesages, ou à faire quoi que ce soit.

Je vous copie donc mes scripts :

serveur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import socket, sys, threading
 
host = "192.168.0.29"
portModem = 60000
portUtil = 60005
 
#Personnalisation de la classe thrading
class ThreadMachine(threading.Thread) :
	def __init__(self, conn) :
		threading.Thread.__init__(self)
		self.connexion = conn
 
	def run(self) :
		#dialogue
		nom =self.getName()
		while 1 :
 
                        msgUtil = connexionUtil.recv(1024)
			for cle in conn_machine :
                            conn_machine[cle].send(msgUtil + "Nom :" + nom + "\n")
                            print msgUtil + "Nom :" + nom
                            msgMachine = connexion.recv(1024)
                            connexionUtil.send("Réponse Machine : " + msgMachine + "\n")
 
		self.connexion.close()
		del conn_machine[nom]
		print "Client %s déconnecté \n" % nom
 
#création du socket
socketMachine = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socketUtil = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#Liaison à une adresse spécifique
try :
	socketMachine.bind((host, portModem))
except socket.error, e:
	print "Impossible d'établir la liason Machine \n"
	print e
	sys.exit()
print "serveur prêt \n"
socketMachine.listen(5)
 
#dico contenant tous les modems connectés
conn_machine = {}
 
 
try :
	socketUtil.bind((host, portUtil))
except socket.error, e:
	print "Impossible d'établir la liason Utilisateur \n"
	print e
	sys.exit()
socketUtil.listen(1)
 
while 1 :
	connexion, adresse = socketMachine.accept()
        connexionUtil, adresseUtil = socketUtil.accept()
	th=ThreadMachine(connexion)
	th.start()
	it=th.getName()
	conn_machine[it] = connexion
	print "Machine %s connecté, adresse IP %s, port %s \n" % (it, adresse[0], adresse[1])
et l'utilisateur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import socket, sys, threading
 
host = "192.168.0.29"
portModem = 60000
portClient = 60005
 
#Personnalisation de la classe thrading
class ThreadReception(threading.Thread) :
	#gère la reception des messages
	def __init__(self, conn) :
		threading.Thread.__init__(self)
		self.connexion = conn	#référence du socket de connexion
 
	def run(self) :
		while 1 :
			msgRecu = self.connexion.recv(1024)
			print "*" + msgRecu + "*\n"
			if msgRecu == "" or msgRecu.upper() == "FIN" :
				break
			#Thread reception FIN
			#Fermeture thread emission
			threadEmis._Thread__stop()
			print "Client arrété, connexion in terrompue \n"
			self.connexion.close()
 
 
class ThreadEmission(threading.Thread) :
	#gère l'envoi des messages
	def __init__(self, conn) :
		threading.Thread.__init__(self)
		self.connexion = conn	#référence du socket de connexion
 
	def run(self) :
		while 1 : 
			msgEmis = raw_input()
			self.connexion.send(msgEmis)
 
#programme
connexion = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try : 
	connexion.connect((host, port))
except socket.error : 
	print "la connexion a échoué \n"
	sys.exit()
print "connexion établie avec le serveur \n"
 
#dialogue
threadEmis = ThreadEmission(connexion)
threadRep = ThreadReception(connexion)
threadEmis.start()
threadRep.start()
Voila ... j'espère avoir été clair !
si vous pouviez me dire pourquoi ca me fonctionne pas, et me donner des solutions qui répondent à mes obligations ...
d'avance merci !!