web-dev-qa-db-ja.com

socket.error:[Errno 32]破損したパイプ

Client-server pythonプログラムを作成しました。このプログラムでは、クライアントがサーバーにリストを送信し、サーバーが配列を受け取り、リストの最初の2つの要素を削除してクライアントに送り返します。リストを受信するサーバーに問題はありませんが、サーバーが編集済みリストを送り返したい場合、エラーが表示されます:socket.error: [Errno 32] Broken pipe。 client.pyとserver.pyは、異なるIPを持つ異なるマシンから実行されています。以下にclient.pyとserver.pyのコードを投稿しています。

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();

エラーメッセージ全体は次のとおりです。

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

クライアントがエラーなしでサーバーから編集済みリストを受信できるように、この問題を修正するにはどうすればよいですか?前もって感謝します。

5
ArnabC

あなたは小さな間違いを犯しました:

_s.send(data_string1);
_

する必要があります:

_conn.send(data_string1);
_

また、次の行を変更する必要があります。

socket.shutdown();からs.shutdown();

そして:

socket.close();からs.close();

8
Stan Vanhoorn