simple serveur avec plusieurs clients
Je suis en train de mettre en œuvre simple serveur avec plusieurs clients. Il devrait recevoir des données de prise et par la suite envoyer des données à d'autres clients. J'utilise sélectionnez le module à partir de la bibliothèque standard de Python.
Voici serveur:
class ProcessingServer:
def __init__(self, bindaddress="localhost", portname=50001, maxqueue=5):
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.bind((bindaddress, portname))
self.socket.listen(maxqueue)
self.inputsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.data = ""
def connect_to_output(self, address, port):
self.inputsocket.connect((address, port))
def start(self):
rsocks = []
wsocks = []
rsocks.append(self.socket)
wsocks.append(self.inputsocket)
self.socket.accept()
while True:
try:
reads, writes, errs = select.select(rsocks, wsocks, [])
except:
return
for sock in reads:
if sock == self.socket:
client, address = sock.accept()
rsocks.append(client)
else:
self.socket.send(self.data)
rsocks.remove(sock)
for sock in writes:
if sock == self.inputsocket:
self.data = sock.recv(512)
wsocks.remove(sock)
print repr(self.data)
Ici est simple client:
import socket
mysocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysocket.connect(("localhost", 50001))
while True:
data = mysocket.recv(512)
print repr(data)
mysocket.close()
Recevant une partie de serveur fonctionne bien, mais le serveur ne produit pas de sortie.
Je ne suis pas expérimenté dans la programmation de réseau à tout et Il se sent comme je suis en manque de quelque chose.
- (chuchote) twisted
- Merci, mais je tiens à garder les choses aussi simples que possible))
- Twisted est beaucoup plus simple que d'utiliser les sockets. Vous n'avez même pas à vous soucier de threads. Tordu n' tous que le jazz pour vous.
Vous devez vous connecter pour publier un commentaire.
Il y a quelques choses qui semblent bizarres dans votre script.
L'utilisation standard de l'sélectionnez le module est le suivant: vous avez un socket pour écouter les connexions, et une prise pour la connexion avec les clients.
Au premier abord, que cette prise est ajoutée à vos lecteurs potentiels de liste et de votre potentiel écrivains liste est vide.
Appel à select.sélectionnez(potential_readers, potential_writers, potential_errors) sera de retour 3 listes:
- Les prises prêt pour la lecture
- Les prises prêt pour l'écriture
- Les prises en erreur
Dans la liste des sockets prêt pour la lecture, si le socket est celui de l'écoute de la connexion, il doit l'accepter et de mettre le nouveau socket, le potentiel de lectures, le potentiel de l'écrit et les erreurs potentielles.
Si le socket est un autre puis, il y a des données à lire à partir de cette prise. Il est recommandé de faire un appel à la chaussette.recv(longueur)
Si vous souhaitez envoyer des données, vous devez l'envoyer à partir de votre wlist retournée par select.sélectionnez.
La errlist n'est pas utilisé très souvent.
Maintenant, pour la solution à votre problème, la façon dont vous décrivez votre protocole (si j'ai bien compris), il pourrait ressembler à ceci:
Je n'ai pas testé ce code, alors il pourrait y avoir quelques erreurs, mais c'est à la façon dont je le ferais.
if sock == sock_producer: ...
Ouais...utiliser zeromq à la place:
server.py
client.py