如果程序处于活动状态,套接字 python 不会发送数据



我正在尝试运行客户端/服务器脚本,其中客户端向服务器发送文件并等待响应,直到服务器发送停止消息。问题是:一旦建立了连接,客户机就开始发送数据,但是直到我按CTRL-C,服务器才能够重新创建文件。只有按CTRL-C后才能打印"文件已完全创建";在文件似乎在等待什么东西之前,它就会变得可见。我不知道问题出在哪里。还尝试使用len()更改发送循环的条件,但不起作用。谁知道怎么修理它?

client.py:

import socket               # Import socket module
# from threading import Thread
s = socket.socket()         # Create a socket object
HOST = "101.xx.x.xxx"       # public IP address
PORT = 4243                 # Reserve a port for your service.
PDF_PATH = "exam.pdf"
s.connect((HOST, PORT))
def send():
f = open(PDF_PATH, "rb")
while data := f.read(4096):
s.send(data)
f.close()
return

def receive():
while 1:
exercise = s.recv(4096)
if exercise == "stop!":
s.close()
break
f = open(f"{exercise}.txt", "wb")
while data := f.read(4096):
f.write(data)
return
def main():
send()
receive()

if __name__ == "__main__":
main()

server.py:

import socket
from threading import Thread
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
HOST = socket.gethostname()
IP = socket.gethostbyname(HOST)
PORT = 4243
s.bind(('', PORT))
s.listen(5)
def receive_file(conn, i):
f = open(f"exam.pdf", "wb")
while received := conn.recv(4096):
f.write(received)
print("File is fully copiedn")
f.close()
def send_result(conn,i):
while 1:
nbr = str(input("which exercise? "))
if nbr == "stop!":
break
f = open(f"exercise{nbr}.txt", "rb")
conn.send(bytes(f"exercise{nbr}.txt", encoding="utf-8"))
while data := f.read(4096):
conn.send(data)
f.close()
def main():
try:
while 1:
i = 0
conn, addr = s.accept()
print("Got connection from", addr)
# c.send(b"Thank you for connecting")
t = Thread(target=receive_file, args=(conn, i))
t.start()
t.join()
t = Thread(target=send_result, args=(conn, i))
t.start()
t.join()
except KeyboardInterrupt:
print("interrupting n")
conn.close()
s.close()

if _name_ == '_main_':
main()

服务器中的conn.recv()不会返回''(没有更多的数据),除非客户端关闭连接或调用shutdown(SHUT_WR)表示发送完成:

def send():
with open(PDF_PATH, "rb") as f:
while data := f.read(4096):
s.sendall(data)
s.shutdown(socket.SHUT_WR)

另一种选择是设计一个协议,在数据发送之前发送数据的长度,这样你就知道什么时候收到了完整的传输。如果您需要在不关闭套接字或关闭发送的情况下发送多个内容,则需要这样做。如果您想要发送多个练习文件,您将需要这个来使服务器的receive部分工作。

通过套接字发送多个文件的示例请参考此回答。

最新更新