Python sockets - garder prise en vie?
Je vais avoir un peu de mal avec les sockets en Python. Chaque fois que quelqu'un se connecte, il fonctionne très bien, mais si ils déconnecter le serveur du programme se ferme. Je veux que le programme de serveur de rester ouvert après que le client ferme. Je suis à l'aide d'une boucle while True de garder la connexion, mais une fois que le client ferme la connexion au serveur ferme la connexion.
Ici est le client:
import socket, sys
conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = sys.argv[1]
port = int(sys.argv[2])
conn.connect((host, port))
print("Connected to host " + sys.argv[1])
td = 1
while td == 1:
msg = raw_input('MSG: ')
Voici le serveur:
import socket, sys
socket.setdefaulttimeout(150)
host = ''
port = 50005
socksize = 1024
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
print("Server started on port: %s" % port)
s.listen(1)
print("Now listening...\n")
conn, addr = s.accept()
while True:
print 'New connection from %s:%d' % (addr[0], addr[1])
data = conn.recv(socksize)
if not data:
break
elif data == 'killsrv':
conn.close()
sys.exit()
else:
print(data)
Êtes-vous à l'aide de n+1 prise pour n connexions? Vous avez besoin d'un support qui est à l'écoute à tout moment. Ce socket d'écoute accepte de nouvelles connexions et ouvre une autre prise chaque fois qu'une connexion est demandée
Pouvez-vous poster un petit bout de code pour illustrer le problème?
n+1 sockets? Ne sais pas si je suis la suite. Pourriez-vous expliquer un peu plus?
Si vous voulez que quelque chose soit fait usage au moins une
Pouvez-vous poster un petit bout de code pour illustrer le problème?
n+1 sockets? Ne sais pas si je suis la suite. Pourriez-vous expliquer un peu plus?
Si vous voulez que quelque chose soit fait usage au moins une
socketserver
.OriginalL'auteur AustinM | 2011-02-24
Vous devez vous connecter pour publier un commentaire.
Si un client ferme la connexion, vous souhaitez fermer le socket.
Il semble que il ya un peu de déconnecter ici que je vais essayer de développer. Lorsque vous créez un socket, bind, et écoutez, vous avez établi une porte ouverte pour d'autres à venir et de faire des liens vers vous.
Une fois qu'un client se connecte à vous, et que vous utilisez le
accept()
appel pour accepter la connexion et d'obtenir un nouveau socket (conn
), qui est retourné pour vous d'interagir avec le client. L'original de votre socket d'écoute est toujours là et actif, et vous pouvez toujours l'utiliser pour qu'il accepte plus de nouvelles connexions.Regardant votre code, vous voulez probablement faire quelque chose comme ceci:
Veuillez noter que ce n'est qu'un point de départ, et comme d'autres l'ont suggéré que vous devriez utiliser
select()
avec un fork de processus ou de frai threads au service de chaque client.Pouvez-vous développer votre code client et envoi de données?
OriginalL'auteur Jeff
Votre code est seulement en acceptant un unique de connexion de la boucle ne traite que de la première accepté de connexion et se termine dès qu'il a perdu. C'est la façon dont votre serveur existe:
Ce que vous devez faire est d'accepter plusieurs connexions, tandis que la manipulation de chacun de vous dans sa propre boucle. Notez qu'il n'a pas à être une vraie boucle pour chaque prise, vous pouvez utiliser un
select
approche fondée sur requête de la sockets doté d'un événement qui lui est associé (données disponibles, perte de connexion, etc.) et alors que les sockets, tous dans la même boucle.Vous pouvez également utiliser un multi threaded /multi approche processus, qui traite de chaque client dans son propre thread ou processus - je suppose que vous ne rencontrerez pas de mise à l'échelle des problèmes lors de la lecture autour de.
Voir:
http://docs.python.org/library/select.html
http://docs.python.org/library/multiprocessing.html
Je seconde ce
OriginalL'auteur Jim Brissom