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?
Correction de l'indentation. Ce code ne sera pas exécuté. –
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 ... –
Votre indentation ne s'affiche toujours pas correctement. Supprimez les onglets de votre code et répétez-le. –