套接字错误:[Errno 32] 破裂的管道

8
我编写了一个Python客户端-服务器程序,其中客户端发送一个列表给服务器,服务器接收该数组,删除列表的前两个元素并将其发送回客户端。服务器接收列表没有问题。但是当服务器想要发送编辑后的列表时,会显示错误:socket.error: [Errno 32] Broken pipe。client.py和server.py运行在不同IP的不同计算机上。下面是client.py和server.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

我应该如何解决这个问题,以便客户端可以在没有任何错误的情况下从服务器接收已编辑的列表? 谢谢您提前。

请包含完整的错误回溯以准确指示消息来自哪里。 - cdarke
追踪(Traceback)最近的一次调用: 文件“server.py”,第22行,在<module>中: s.send(data_string1); 套接字错误:[Errno 32] Broken pipe这是完整的错误信息。 - ArnabC
好的,很有可能客户端在recv之后中断连接并关闭了套接字。你可能需要追踪客户端(添加一些print语句)以查看为什么它会过早关闭套接字。参考也可以查看https://dev59.com/tGct5IYBdhLWcg3wufxb - cdarke
1个回答

14

你犯了一个小错误:

s.send(data_string1);
应该是:
conn.send(data_string1);

还有以下行需要更改:

socket.shutdown(); 更改为 s.shutdown();

和:

socket.close(); 更改为 s.close();


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接