【问题标题】:Python3 - [Errno 32] Broken Pipe while using socketsPython3 - [Errno 32] 使用套接字时管道损坏
【发布时间】:2020-01-25 13:51:04
【问题描述】:

我有以下服务器代码:

import socket
import threading

def handle_client(client_socket):
    request = client_socket.recv(1024)
    print ("[*] Received: %s" % request)
    client_socket.send("ACK!".encode("utf-8"))
    client_socket.close()

bind_ip = "0.0.0.0"
bind_port = 9998
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((bind_ip, bind_port))
server.listen(5)
print ("[*] Listening on %s:%d" % (bind_ip, bind_port))

while True:
    client, addr = server.accept()
    print ("[*] Accepted connection from: %s:%d" % (addr[0], addr[1]))
    client_handler = threading.Thread(target = handle_client, args = (client))
    client_handler.start()

以及客户端的以下内容:

def client_sender(buffer):
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect((target, port))
    if len(buffer) > 0:
        client.send(buffer.encode("utf-8"))
        data = client.recv(4096).decode("utf-8")
        print(" - " + data)
    while True:
        buffer = input("Input:")
        buffer += "\n"
        client.send(buffer.encode("utf-8"))
        data = client.recv(4096).decode("utf-8")
        print (" - " + data)

函数 client_sender 被另一个函数调用,我可以选择是监听传入连接还是向某人发送数据。 我会这样称呼它:

python3 文件名.py -ip 0.0.0.0 -port 9998

然后我可以写一些数据。我第一次这样做时,我按 CTRL + D 发送它,服务器得到,客户端得到响应。但是当我尝试从“While True”循环内部发送一些数据时,服务器永远不会得到它,我收到了这个:

client.send(buffer.encode("utf-8"))
BrokenPipeError: [Errno 32] Broken pipe

我该如何解决?我发现唯一可行的解​​决方案是将这两行移到“While True”循环中:

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((target, port))

但是,我每次都重新连接似乎效率低下。

编辑 正如 Sam Mason 所建议的,通过以下方式更改 handle_client 可以解决问题:

def handle_client(client_socket):
    while True:
        request = client_socket.recv(1024).decode("utf-8")
        if len(request):
            print ("[*] Received: %s" % request)
            client_socket.send("ACK!".encode("utf-8"))
        else:
            client_socket.close()
            break

【问题讨论】:

    标签: python python-3.x sockets broken-pipe


    【解决方案1】:

    您的服务器在单个recv 之后立即关闭端口。我建议将您的handle_client 代码更改为具有某种while 循环,该循环在recv 返回一个空字符串时结束(这表明客户端有shutdown 他们的连接结束,可能是closeing他们的联系)

    【讨论】:

      猜你喜欢
      • 2022-01-25
      • 1970-01-01
      • 2021-01-04
      • 2017-04-22
      • 2013-04-16
      • 2014-04-28
      • 2022-01-10
      • 1970-01-01
      • 2011-09-11
      相关资源
      最近更新 更多