Comment mettre en œuvre non bloquant socket serveur en python
Un semblable, mais autre question:
J'ai un client IRC qui génère des chaînes de caractères. Ce client IRC utilise un crochet pour appeler une méthode (somone_said) à chaque fois que quelqu'un dit quelque chose. Je veux envoyer cette chaîne sur un socket à mon client flash.
J'ai un client de travail dans flash et un serveur en python, mais le problème est qu'il bloque:
1) lors de l'écoute de la connexion du client
2) lors de l'attente pour le prochain message généré
Cela empêche le client IRC à partir de répondre à d'autres entrées.
Je pense que j'ai besoin de créer ma prise dans un thread séparé, mais cela crée des trois plus de problèmes.
1) comment est-ce que mon someone_said événement piloté par la méthode d'accès à la socket
2) Que faire si quelqu'un dit quelque chose quand il n'y a pas de serveur de connexion du client (pendant l'écoute) ou si le client a fermé la connexion.
3) Comment faire pour vérifier si le thread est en vie et si ce n'est pour en ouvrir un nouveau?
Mon blocage code du serveur est: est-ce
# Echo server program
import socket
import sys
HOST = None # Symbolic name meaning all available interfaces
PORT = 7001 # Arbitrary non-privileged port
s = None
def startListening():
print "starting to listen"
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC,
socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
af, socktype, proto, canonname, sa = res
try:
s = socket.socket(af, socktype, proto)
except socket.error as msg:
s = None
continue
try:
s.bind(sa)
s.listen(1)
except socket.error as msg:
s.close()
s = None
continue
break
if s is None:
print 'could not open socket'
sys.exit(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
try:
data = conn.recv(1024)
except:
print "cannot recieve data"
break
if not data:
break
print data
message = ""
while not "quit" in message:
message = raw_input('Say Something : ') # This will come from event driven method
try:
conn.sendall(message)
except Exception as exc:
print "message could not be sent"
break
conn.close()
print "connection closed"
while 1:
startListening()
La xchat module python script fonctionne comme ceci (nécessite HexChat à exécuter)
__module_name__ = "Forward Module"
__module_version__ = "1.0.0"
__module_description__ = "Forward To Flash Module by Xcom"
import sys
import xchat
def someone_said(word, word_eol, userdata):
# method called whenever someone speaks in IRC channel
username = str(word[0]) # From IRC contains the username string
message = str(word[1]) # From IRC contains the user message
sendString = username + " : " + message
send_to_server(sendString)
def send_to_server(message):
# send over socket method to be implemented here
xchat.hook_print('Channel Message' , someone_said)
J'ai été frapper ma tête contre ce mur pendant des jours maintenant. M'aider à obi wan kenobi, vous êtes mon seul espoir.
OriginalL'auteur Zac | 2013-06-04
Vous devez vous connecter pour publier un commentaire.
Ont un look à Asyncore, c'est exactement fait pour ce que vous êtes à la recherche d' 🙂
http://docs.python.org/2/library/asyncore.html
Acclamations,
K.
Python vous offre la possibilité d'utiliser
socket.setblocking(0)
, après qui votre socket sera non bloquant. La principale source de documentation est disponible ici (docs.python.org/2/howto/sockets.html#non-blocking-sockets) et vous avez également l'utilisation de certains ici (pymotw.com/2/select/index.html).Le programme reste bloqué lors de l'écoute du client pour se connecter ou entre les envoie. Je ne peux pas permettre le blocage de programme/pause comme ça parce que c'est censé être d'autres choses à faire en même temps.
Avez-vous jeter un oeil à Filetages ?
OriginalL'auteur Koreth