尝试在 Python 套接字中将数据从服务器发送到客户端时发生管道错误
Broken pipe error when trying to send data from server to client in Python sockets
我正在尝试使用“vanilla”Python 套接字将数据从服务器传输到客户端,而不使用任何异步编程。我的用例如下:我希望本地 Raspberry Pi 连接到我的 Internet 公开服务器,并且服务器在给定事件发生时通过创建的套接字发送数据。
我按照 Python 中关于简单套接字编程的几个教程构建了以下代码:
server.py
import socket
import time
def server():
PORT = 65432
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('0.0.0.0', PORT))
s.listen(1)
conn,address=s.accept() # accept an incoming connection using accept() method which will block until a new client connects
print("address: ", address[0])
time.sleep(5)
s.send("hey".encode())
conn.close()
return
server()
client.py
import socket
import time
HOST = "my.remote.domain"
PORT = 65432
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
while True :
print(s.recv(1024))
time.sleep(1)
在各自的机器上启动服务器和客户端时,我可以看到连接正确,因为客户端的 IP 地址打印在服务器的日志中。然而,几秒钟后,在发送任何数据之前,我在服务器端收到以下错误:
address: client_ip_address_appears_here
Traceback (most recent call last):
File "main.py", line 32, in <module>
receiver()
File "main.py", line 18, in receiver
s.send("heeey".encode())
BrokenPipeError: [Errno 32] Broken pipe
同时在客户端,没有收到数据:
b''
b''
b''
b''
b''
b''
b''
b''
b''
我尝试处理套接字的方式是否存在概念性问题?
尝试代码后,我认为您遇到的最大问题是服务器试图在错误的套接字上发送。即这一行:
s.send("hey".encode())
应该改写成这样:
conn.send("hey".encode())
事实上,您正在尝试在 TCP 接受套接字上发送 (),而不是在与客户端的 TCP 连接上,这是没有意义的。在我的 (MacOS/X) 系统上,服务器进程打印此错误输出:
Jeremys-Mac-mini-2:~ jaf$ python server.py
('address: ', '127.0.0.1')
Traceback (most recent call last):
File "server.py", line 18, in <module>
server()
File "server.py", line 14, in server
s.send("hey".encode())
socket.error: [Errno 57] Socket is not connected
我正在尝试使用“vanilla”Python 套接字将数据从服务器传输到客户端,而不使用任何异步编程。我的用例如下:我希望本地 Raspberry Pi 连接到我的 Internet 公开服务器,并且服务器在给定事件发生时通过创建的套接字发送数据。
我按照 Python 中关于简单套接字编程的几个教程构建了以下代码:
server.py
import socket
import time
def server():
PORT = 65432
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('0.0.0.0', PORT))
s.listen(1)
conn,address=s.accept() # accept an incoming connection using accept() method which will block until a new client connects
print("address: ", address[0])
time.sleep(5)
s.send("hey".encode())
conn.close()
return
server()
client.py
import socket
import time
HOST = "my.remote.domain"
PORT = 65432
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
while True :
print(s.recv(1024))
time.sleep(1)
在各自的机器上启动服务器和客户端时,我可以看到连接正确,因为客户端的 IP 地址打印在服务器的日志中。然而,几秒钟后,在发送任何数据之前,我在服务器端收到以下错误:
address: client_ip_address_appears_here
Traceback (most recent call last):
File "main.py", line 32, in <module>
receiver()
File "main.py", line 18, in receiver
s.send("heeey".encode())
BrokenPipeError: [Errno 32] Broken pipe
同时在客户端,没有收到数据:
b''
b''
b''
b''
b''
b''
b''
b''
b''
我尝试处理套接字的方式是否存在概念性问题?
尝试代码后,我认为您遇到的最大问题是服务器试图在错误的套接字上发送。即这一行:
s.send("hey".encode())
应该改写成这样:
conn.send("hey".encode())
事实上,您正在尝试在 TCP 接受套接字上发送 (),而不是在与客户端的 TCP 连接上,这是没有意义的。在我的 (MacOS/X) 系统上,服务器进程打印此错误输出:
Jeremys-Mac-mini-2:~ jaf$ python server.py
('address: ', '127.0.0.1')
Traceback (most recent call last):
File "server.py", line 18, in <module>
server()
File "server.py", line 14, in server
s.send("hey".encode())
socket.error: [Errno 57] Socket is not connected