web-dev-qa-db-fra.com

socket.error: [Errno 32] Pipe cassée

J'ai écrit un client-serveur python programme où le client envoie une liste au serveur, le serveur reçoit le tableau, supprime les deux premiers éléments de la liste et le renvoie au client. Là il n'y a aucun problème avec le serveur qui reçoit la liste. Mais lorsque le serveur veut renvoyer la liste éditée, il affiche une erreur: socket.error: [Errno 32] Broken pipe. Le client.py et le server.py s'exécutent à partir de différentes machines avec différentes IP. Je publie le code pour le client.py et server.py ci-dessous:

Client.py

import socket, pickle
Host = '192.168.30.218'
PORT = 50010
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((Host, PORT))
arr = ['CS','UserMgmt','AddUser','Arnab','Password']
data_string = pickle.dumps(arr)
s.send(data_string)
data = s.recv(4096)
data_arr1 = pickle.loads(data)
s.close()
print 'Received', repr(data_arr1)
print data_arr1;

Server.py:

import socket, pickle;
Host = '127.0.0.1';
PORT = 50010;
s= socket.socket(socket.AF_INET, socket.SOCK_STREAM);
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1);
s.bind(('',PORT));
s.listen(1);
conn, addr = s.accept();
print 'Connected by' , addr;
data_addr = list();
while 1:
        data = conn.recv(4096);
        if not data: break;
        data_addr = pickle.loads(data);
        print 'Received Data',  repr(data_addr);
        print data_addr;
        data_addr.pop(0);
        data_addr.pop(0);
        print data_addr;
        data_string1 = pickle.dumps(data_addr);
        s.send(data_string1);
        break;
conn.close();
socket.shutdown();
socket.close();

Le message d'erreur complet est:

Traceback (most recent call last):
File "server.py", line 22, in <module>
s.send(data_string1);
socket.error: [Errno 32] Broken pipe

Comment puis-je résoudre ce problème afin que le client puisse recevoir la liste éditée du serveur sans aucune erreur? Merci d'avance.

5
ArnabC

Vous avez fait une petite erreur:

s.send(data_string1);

Devrait être:

conn.send(data_string1);

Les lignes suivantes doivent également être modifiées:

socket.shutdown(); à s.shutdown();

Et:

socket.close(); à s.close();

8
Stan Vanhoorn