Socket Asynchrone, Connect() non bloquant
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 :x.
Voila un petit schéma de ce que je voudrais arriver a faire :
http://img4.hostingpics.net/thumbs/m...cketpython.png
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 :oops:.
Voila ma classe SocketBase a l'heure actuel :
Code:
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:
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 :x.
Cordialement, Quentin.