01_基于TCP的循环为同一个客户端下载文件的下载器

时间:2023-03-09 17:29:15
01_基于TCP的循环为同一个客户端下载文件的下载器

原版:

TCP分为客户端(client)和服务器(server),每次服务器只能为客户端提供一次的下载服务。

改良版:

TCP分为客户端(client)和服务器(server),

(1)每次服务器能为客服端循环提供下载服务,

(2)服务器能够识别出不存在的文件并且发送客户端,

(3)客户端能够通过输入退出下载服务,并且服务器能够退出为当前客户端的服务,等待为下一个客户端的服务。

难点:

(1)处理不存在的文件,引入了continue关键字,若不引入,当下载遇到不存在的文件,之前存储上一个文件数据的变量会作为数据发送给客户端!!

(2)客户端和服务器退出当前服务,引入了break关键字。

自学自练,欢迎指正。

 # 客户端
import socket def main(): # 1,创建套接字 tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2,链接服务器
server_ip = input('获取服务器的IP:')
server_port = int(input('获取服务器的端口号:'))
tcp_client.connect((server_ip, server_port))
print('温馨提示:')
print('*'*20)
print('如果想要终止下载文件的请求, 请输入“quit”, 退出下载!')
while True:
# 3,获取要下载的文件名
file_name = input('输入要下载的文件名:') # 4,发送文件名到服务器
send_data = tcp_client.send(file_name.encode('utf-8')) if file_name == 'quit': # 这里if判断语句要放置在send_data之后,让客户端把quit发送到服务器,服务器退出为当前客户端服务,等待为下一个客户端服务。
break # 5,接收数据
recv_data = tcp_client.recv(1024)
if recv_data.decode('utf-8') != '':
# print('接收数据:' ,recv_data.decode('utf-8'))
with open('C:\\Users\\Administrator\\Desktop\\练习生\\网络通信\\'+ '[副本]'+file_name, 'wb') as f:
f.write(recv_data)
else:
print('文件不存在') tcp_client.close() if __name__ == '__main__':
main()

 import socket
def send_2_client(tcp_client, tcp_addr): # 循环为一个客户端服务
while True:
# 1 接收客服端发送的文件名数据或者接收客户端退出下载的请求(quit)
recv_data = tcp_client.recv(1024) file_name = recv_data.decode('utf-8')
print('客户端:%s,请求下载的文件:%s' % (str(tcp_addr),file_name)) # 退出为当前客服端的下载服务
if file_name == 'quit':
break
# 2 读取文件数据 try:
f = open(file_name, 'rb')
send_content = f.read()
f.close() #关闭文件,释放内存
except:
print('文件不存在')
tcp_client.send(''.encode('utf-8'))
continue #当下载的文件不存在时,循环重新开始,等待当前客户端发送新的下载请求 # 3 发送数据
tcp_client.send(send_content)
tcp_client.close() def main():
# 1,创建服务器套接字
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2,绑定地址信息
tcp_server_socket.bind(('', 7788)) # 3,设置为被动监听
tcp_server_socket.listen(128) # 4,循环等待客户端的访问
# 循环为多个客户端服务
while True:
print('等待客服端的访问请求...')
tcp_client, tcp_addr = tcp_server_socket.accept()
send_2_client(tcp_client, tcp_addr)
tcp_server_socket.close() if __name__ == '__main__':
main()