Python3 - [Errno 32] 使用套接字时管道损坏
Python3 - [Errno 32] Broken Pipe while using sockets
我有以下服务器代码:
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 filename.py -ip 0.0.0.0 -port 9998
然后我可以写一些数据。我第一次这样做时,我按 CTRL + D 发送它,服务器收到并且客户端收到 response.But 当我尝试从 "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
您的服务器在 recv
后立即关闭端口。我建议更改您的 handle_client
代码以具有某种 while
循环,该循环在 recv
returns 空字符串时结束(这表明客户端有 shutdown
他们的连接结束,可能是通过 close
ing 他们的连接)
我有以下服务器代码:
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 filename.py -ip 0.0.0.0 -port 9998
然后我可以写一些数据。我第一次这样做时,我按 CTRL + D 发送它,服务器收到并且客户端收到 response.But 当我尝试从 "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
您的服务器在 recv
后立即关闭端口。我建议更改您的 handle_client
代码以具有某种 while
循环,该循环在 recv
returns 空字符串时结束(这表明客户端有 shutdown
他们的连接结束,可能是通过 close
ing 他们的连接)