Python Prise De Plusieurs Clients
Donc je suis en train de travailler sur une application iPhone qui nécessite une prise de gérer plusieurs clients pour les jeux en ligne. J'ai essayé Tordus, et avec beaucoup d'effort, je n'ai pas réussi à obtenir un tas d'info pour être envoyé à la fois, c'est pourquoi je vais maintenant tenter de socket.
Ma question est, à l'aide du code ci-dessous, comment voulez-vous être en mesure d'avoir plusieurs clients connectés? J'ai essayé de listes, mais je ne peux pas trouver le format qui. Comment cela peut-il être accompli lorsque plusieurs clients sont connectés à la fois et je suis en mesure d'envoyer un message à un client spécifique?
Merci!
#!/usr/bin/python # This is server.py file
import socket # Import socket module
s = socket.socket() # Create a socket object
host = socket.gethostname() # Get local machine name
port = 50000 # Reserve a port for your service.
print 'Server started!'
print 'Waiting for clients...'
s.bind((host, port)) # Bind to the port
s.listen(5) # Now wait for client connection.
c, addr = s.accept() # Establish connection with client.
print 'Got connection from', addr
while True:
msg = c.recv(1024)
print addr, ' >> ', msg
msg = raw_input('SERVER >> ')
c.send(msg);
#c.close() # Close the connection
- Faire un tout de
c, addr = s.accept()
quand un client connecté à les stocker dans un client_list, puis démarrer un Thread d'elle. - Serait-il comme.... alors: c, addr = s.accept() client_list = [] client_list.append(c, addr)
- Je sais que c'est un énorme changement, mais envisagez de Ruby EventMachine - j'ai trouvé le EventMachine documentation nettement plus facile à lire et à comprendre que les Tordus de la documentation. L'inconvénient de Ruby est le plus petit de l'écosystème de la bibliothèque de liaisons et des paquets, mais c'est mieux que de il était une fois...
- Je préfère le bâton avec Python, je pense qu'il serait bon de rester avec elle. Merci pour votre suggestion mais.
- Vous avez besoin d'avoir le
client_list=[]
sortir de la boucle while, en est un bon exemple heresi vous voulez juste C-c C-v. - ouais, je peux comprendre, surtout si vous avez d'autres code écrit en Python. Il vient de me frappe à chaque fois que je vois Tordu documentation compliqué qu'ils ont fait quelques choses...
- Je ne suis pas très expérimenté dans le présent, donc je ne peux pas tout à fait le comprendre. Je ne suis pas le comprendre assez bon.
- Avez-vous vérifié l'exemple de lien? Modifier ensuite l'exécuter, et vous obtiendrez ce que vous voulez. Le Serveur peut gérer plusieurs clients. Si vous voulez en savoir plus, lire le code.
- Donc je ne peut pas utiliser de listes? Il a d'être qu'en profondeur? Je sais que lorsque j'ai utilisé Tordu, il semblait plus simple.
- Twisted est un plus complexe, tordu asynchrone lib que l'exemple. Si vous faites vraiment un projet très complexe, il vaut la peine de passer du temps à l'apprendre. Lorsque vous utilisez des listes, il est plus comme une façon synchrone dans lequel votre code est bloqué dans chaque réseau de communication.
- Pouvez-vous me donner un début dans cette boucle? Je ne peux pas penser dès maintenant. 🙁
- Un thread par client n'est pas à l'échelle. Je sais Tordu est difficile à obtenir, mais une fois que vous avez une certaine expérience avec elle, c'est le goto-outil pour presque toutes les choses liées. Des trucs comme celui que vous essayez de résoudre.
Vous devez vous connecter pour publier un commentaire.
Basé sur votre question:
À l'aide du code que vous avez donné, vous pouvez le faire:
Comme Eli Bendersky mentionné, vous pouvez utiliser les processus au lieu de threads, vous pouvez également vérifier python
threading
module ou d'autres async sockets cadre. Remarque: les contrôles sont à gauche pour vous de mettre en œuvre la façon dont vous voulez et ce n'est qu'un cadre de base.clientsocket.close()
après lawhile True:
dans la fonction et less.close()
après lawhile True:
au fond ne sera jamais appelé, car il n'y a pasbreak
s dans lewhile True:
et la seule façon de sortir de la boucle est avec une exception, qui ne seront pas pris et prendra fin le fil. Un gestionnaire de contexte serait une meilleure façon de s'assurer que le socket est fermé.accept
continue de fournir de nouvelles connexions client. Toutefois, notez que c', et d'autres appels de socket sont généralement de blocage. Par conséquent, vous avez quelques options, à ce stade:Voici l'exemple de la SocketServer documentation qui ferait un excellent point de départ
L'essayer à partir d'un terminal comme ce
Vous aurez probablement besoin d'utiliser Un Bifurquer ou Filetage Mixin trop
Ce programme sera ouvert 26 sockets où vous serez en mesure de connecter un grand nombre de clients TCP pour elle.