2016-09-09 40 views
0

Je joue avec socket et essayé de créer un serveur de discussion simple avec une seule connexion client. Code et sortie comme suit.Comment réparer un tuyau cassé dans le serveur de chat en utilisant socket en Python après la première demande?

echo_server.py

import socket 

host = '' 
port = 4538 
backlog = 5 
size = 1024 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((host,port)) 
s.listen(backlog) 
print "Starting Server" 

while 1: 
    client, address = s.accept() 
    try: 
     data = client.recv(size) 
     if data is not None: 
     if data is 'q': 
     print "I received request to close the connection" 
     client.send('q') 
       continue 
     print "I got this from client {}".format(data) 
      client.send(data) 
      continue 
      if data == 0: 
       client.close() 
    finally: 
     client.close() 

echo_client.py

import socket 

host = '' 
port = 4538 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((host,port)) 

try: 
    while 1: 
     message = filename = raw_input('Enter a your message: ') 
    s.send(message) 
    data = s.recv(1024) 
     if data is 'q': 
     print "You requested to close the connection" 
      break 
    print "Received from socket {}".format(data) 
finally: 
    s.close() 

Maintenant, j'avais essayé avec Sendall() aussi, mais cela ne fonctionne pas. Voici la sortie des deux côtés

client:

Enter a your message: hello 
Received from socket hello 
Enter a your message: world 
Received from socket 
Enter a your message: hi 
Traceback (most recent call last): 
    File "echo_client.py", line 12, in <module> 
    s.send(message) 
socket.error: [Errno 32] Broken pipe 

Et sur le serveur

Starting Server 
I got this from client hello 

Comme vous pouvez le voir, le serveur ne reçoit pas le second message (monde). Et répond avec rien et quand j'envoie une troisième requête au serveur avec salut, le client se termine par Broken Pipe Comment puis-je réparer?

EDIT 1:

J'ai changé le code maintenant il suit. Le s.accept() reste coincé dans la deuxième requête. Voici le code. echo_server.py

import socket 

host = '' 
port = 4538 
backlog = 5 
size = 1024 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((host,port)) 
s.listen(backlog) 
print "Starting Server" 

try: 
    while 1: 
    print "BEFORE REQUEST" 
     client, address = s.accept() 
    print "AFTER REQUEST" 
     data = client.recv(size) 
     if data: 
     if data is 'q': 
       print "I received request to close the connection" 
      client.send('q') 
     print "I got this from client {}".format(data) 
      client.send(data) 
     else: 
     print "CLOSING IN ELSE" 
      client.close() 
except: 
    print "CLOSING IN except" 
    client.close() 

Après la sortie. Comme vous pouvez le constater pour la deuxième fois, accept() ne retourne jamais. Comment le faire fonctionner?

+0

Correction de l'indentation. Ce code ne sera pas exécuté. –

+2

Vous fermez toujours la connexion sur le serveur - la clause 'finally' d'un bloc' try' s'exécute toujours (exception ou non) ... On dirait que vous voulez fermer la connexion et rompre la boucle avec un 'except' Au lieu de cela ... –

+0

Votre indentation ne s'affiche toujours pas correctement. Supprimez les onglets de votre code et répétez-le. –

Répondre

1

recv renvoie une chaîne vide lorsque le client ferme la connexion, et non None ou 0. Puisque la chaîne vide est une condition False, utilisez simplement if data: ou if not data:.

Et, comme @JonClements souligné, utilisez un except au lieu d'un finally dans le serveur, ou mettre le while à l'intérieur du try et if not data: break pour quitter le while et exécuter le finally.

+0

J'ai fait les changements mentionnés. Mais maintenant, quand j'envoie le deuxième message, il est coincé. La sortie est comme ci-dessous client: - Entrez un message: Bonjour Received de la prise Bonjour Entrez un message: serveur mondial : - À partir du serveur je suis arrivé ce du client Bonjour Il ne reçoit pas deuxième message (Monde) @mark –

+0

Vous l'avez. Je mets data = client.recv (taille) et quelques lignes après ça dans 1:, alors ça a marché comme prévu. –