老师这个程序的逻辑个人感觉有点瑕疵
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