typeh
2021-04-19 22:42
1、首先一个问题就是,为什么文件的发送完成与否要由接收端来告知发送端呢?既然文件是分段发送的,接收端怎么知道到底有多少段呢,他只能一直接收。发送端里的for循环不是一个死循环,当文件读取并发送完成的时候,便会结束循环,这个时候才是一个正确的向接收端发送quit结束信号的时机,接收端收到quit,结束内层while死循环,然后这个时候接收端才知道文件已经接收完成了,接着打印接收完成提示信息。发送端程序结束,接收端程序进入下一次外层while循环,继续等待客户端的连接重复上述过程
2、个人感觉接收端内层的while死循环应该放在with语句块里会更合适吧,打开一次文件,然后持续的进行数据的接收和文件的写入
改动了一下老师的程序:
发送端:
# 导入模块
import socket
if __name__ == '__main__':
# 实例化模块
sk = socket.socket()
# 定义连接ip和port
ip_port = ('127.0.0.1', 9999)
# 服务器连接
sk.connect(ip_port)
# 文件上传
# 打开文件
with open('socket_server_tcp.py', 'rb') as file:
# 分块上传
for f in file:
# 数据上传
sk.send(f)
# 给服务器端发送结束信号
sk.send('quit'.encode())
pass接收端:
# 导入模块
import socket
if __name__ == '__main__':
# 实例化
sk = socket.socket()
# 定义连接ip和port
ip_port = ('127.0.0.1', 9999)
# 绑定ip和port
sk.bind(ip_port)
# 最大连接数
sk.listen(5)
# 进入循环接收数据
while True:
# 等待客户端连接
conn, address = sk.accept()
# 打开文件等待数据写入
with open('file', 'ab') as file:
# 一直使用当前连接进行数据接收,直到结束标志出现
while True:
# 接收数据
data = conn.recv(1024)
if data == b'quit':
break
# 写入文件
file.write(data)
# 打印提示信息
print('文件接收完成!')
pass
有自己的想法不错,同学
你说得不错,分析得很好
python运维-Socket网络编程
22571 学习 · 72 问题
相似问题