Bonjour, je commence tout juste a apprendre le langage python (je viens de C#) et donc un problème ce pose : les sockets.

Donc j'ai fait mes classes tout fonctionne sauf que je ne peux pas envoyer et recevoir en même temps .

Voila un petit schéma de ce que je voudrais arriver a faire :


SocketBase est une classe abstraite (on dit comme sa en C#).
J'ai 3 événements au quelle je m'abonne dans ma classe "enfant" :
  • on_connected
  • on_disconnected
  • on_data_arrival


Je voudrais pouvoir envoyer des messages a l'aide d'une méthode send() tout en recevant les données qui arrivent, je sais pas si c'est très clair .

Voila ma classe SocketBase a l'heure actuel :
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import socket
import threading
 
from EventHook import *
 
class SocketBase(object):
 
    # Properties #
    def get_statut(self):
	return self._statut
 
    Statut = property(fget=get_statut)
 
    def get_ip(self):
	return self._ip
 
    Ip = property(fget=get_ip)
 
    def get_port(self):
	return self._port
 
    Port = property(fget=get_port)
 
    def get_socket(self):
	return self._socket
 
    Socket = property(fget=get_socket)
 
 
    socket_connected = EventHook()
    socket_disconnected = EventHook()		
    socket_data_arrival = EventHook()
 
    # End Properties #
 
    # Constructor #
    def __init__(self, ip, port):
    	self._ip = ip
    	self._port = port
    	self._statut = 0
    	self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # End Constructor		
 
    # Function #
    def connect_socket(self, ip = "", port = 0):
    	if (ip is not "") and (port is not 0):
    	    self._ip = ip
    	    self._port = port
 
	print "Ip: %s, Port: %s" % (self._ip, self._port)
 
    	try:
    	    self._socket.connect((self._ip, self._port))
    	    self._statut = 1
    	    self.socket_connected.fire()
    	    return self._statut
    	except socket.error, exception:
	    #print "Error : %s" % exception
	    errorCode = exception[0]
 
	    if int(errorCode) == 10054:
	    	print "Connection on the server has been lost"
 
    	    self._socket.close()
    	    self._statut = 0
    	    return self._statut
 
    def close_socket(self):
    	if self._statut == 1:
    	    self._socket.close()
    	    self._statut = 0
 
    def loop(self):
    	while self._statut != 0:
    	    data = self._socket.recv(1024)
 
    	    if not data:
	    	self.close_socket()
	    	self.socket_disconnected.fire()
	    else:
	    	self.socket_data_arrival.fire(data)
 
    def send(self, msg):
    	self._socket.send(msg)
 
 
    # End Function #
Et ma classe enfant SocketClient :
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
from SocketBase import *
 
class SocketClient(SocketBase):
 
	def __init__(self, ip, port):
		super(SocketClient, self).__init__(ip, port)
		self.socket_connected += self.on_connected
		self.socket_disconnected += self.on_disconnected
		self.socket_data_arrival += self.on_data_arrival
 
	def Connect(self):
		print "Try to connect..."
		self.connect_socket()
 
	def Disconnect(self):
		self.close_socket()
 
	def on_connected(self, *arg, **kwargs):
		print "Connected on the server"
		self.send("HC")
		self.loop()
 
	def on_disconnected(self, *arg, **kwargs):
		print "Disconnected on the server"
 
	def on_data_arrival(self, data):
		print data
Je vous remercie pour d'avance pour l'aide que vous pourrez m'apporté.

Ps: j'oubliais, je suis obliger d'utiliser python 2.2, je dépend d'un logiciel dont je n'ai pas les sources .

Cordialement, Quentin.