Comment garder une socket ouverte jusqu'à ce que le client la ferme?
J'ai simple python serveur et le client.
Serveur:
import SocketServer
import threading
class MyTCPHandler(SocketServer.BaseRequestHandler):
def handle(self):
self.data = self.request.recv(1024).strip()
print str(self.client_address[0]) + " wrote: "
print self.data
self.request.send(self.data.upper())
if __name__ == "__main__":
HOST, PORT = "localhost", 3288
server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)
server.serve_forever()
Client:
import socket
import sys
from time import sleep
HOST, PORT = "localhost", 3288
data = "hello"
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
sock.connect((HOST, PORT))
sock.send(data + "\n")
received = sock.recv(1024)
sleep(10)
sock.send(data + "\n")
received = sock.recv(1024)
sleep(10)
sock.send(data + "\n")
received = sock.recv(1024)
finally:
sock.close()
Ici est le résultat que j'obtiens:
Serveur:
>python server.py
127.0.0.1 wrote:
hello
Client:
>python client.py
Traceback (most recent call last):
File "client.py", line 18, in <module>
received = sock.recv(1024)
socket.error: [Errno 10053] An established connection was aborted by the software in your host machine
Je l'ai essayé sur une machine linux. Le serveur reçoit un seul message, puis j'obtiens une erreur sur le recv déclaration de la deuxième message. Je viens de commencer l'apprentissage de la mise en réseau sur python, mais je pense que le serveur est la fermeture de la socket pour une raison quelconque. Comment puis-je corriger cela?
source d'informationauteur Bruce
Vous devez vous connecter pour publier un commentaire.
Un
MyTcpHandler
objet est créé pour chaque connexion, ethandle
est appelée à traiter avec le client. La connexion est fermée lorsquehandle
retourne, de sorte que vous avez à gérer la communication par le client dans lehandle
méthode:REMARQUE:
recv
retourne''
lorsque le client ferme la connexion, donc j'ai déménagé.strip()
après larecv
donc il n'y a pas de fausse alarme due au client de n'envoyer que des blancs de l'espace.Je vais d'abord admettre que ça fait des années que je n'ai pas utilisé
SocketServer
il y aurait peut-être plus idiomatiques approches pour résoudre votre problème.Noter que votre client ouvre une connexion unique et envoie trois ensembles de données et reçoit trois ensembles de données. (J'espère que la pile TCP sera envoyer données mises en mémoire tampon une fois que vous appelez
receive()
sur le socket.)Votre serveur attend pour gérer une connexion client complètement, du début à la fin, quand il est appelé à partir de la
SocketServer
mécanisme de rappel. Votre classe actuelle fait un peu de IO et puis se ferme. Vous avez juste besoin d'étendre votre serveur de rappel d'en faire plus:À un problème similaire ici erreur: [Errno 10053]
J'ai aussi essayé la même chose et j'ai obtenu le même message d'erreur.
Si il y a un code simple comme cela pour démontrer cette erreur:
Si vous créez une socket et l'amt, il peut envoyer et de récupérer à partir du serveur pour voir combien il récepteurs, si vous varier que, dire de 1024 à 102400(dans ce code);
Ce qui signifie que la prise ne doit pas se ferment, mais encore une fois dans mon système d'exploitation Windows, le serveur conserve l'écoute et l'impression de toutes les données que le client envoie mais sur le côté Client, vous obtenez cette erreur;
Toutefois, si c'est que le client peut se connecter qu'une seule fois et d'envoyer et de recevoir qu'une seule fois, alors que c'est la façon dont il a été conçu. D'essayer cela fonctionne sans erreur:
Je ne suis pas sûr si un socket objet fonctionne qu'une seule fois pour envoyer et recevoir des données.
Mise à JOUR
Je pense que le problème est la capacité par socket client pour la réception de données selon la taille de tampon fixe;
C'est pourquoi le deuxième extrait de code ci-dessus fonctionne donc de la création de nouveau client, prises de branchement sur le serveur. Mais de cette façon, beaucoup de prises allez obtenir.
À la place le code suivant résolu le problème en vérifiant l'amt de la taille utilisée. Si elle dépasse un certain montant, il crée un nouveau socket chez les clients, mais permet de s'assurer que le message est envoyé; en Fait le problème était avec le code du serveur, mais il fixe.
size = 10
C'est un moyen rapide de bébé lors de la tentative de code. Je suis sûr que vous comprenez et l'optimiser pour le mieux!
code client:
Code Serveur:
De l'essayer. Il utilise le même socket.