欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-03-31 19:13:27
原版: TCP分为客户端(client)和服务器(server),每次服务器只能为客户端提供一次的下载服务。 改良版: TCP分为客户端(client)和服务器(server), (1)每次服务器能为客服端循环提供下载服务, (2)服务器能够识别出不存在的文件并且发送客户端, (3)客户端能够通过输 ......

原版:

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

改良版:

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

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

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

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

难点:

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

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

 

自学自练,欢迎指正。

 1 # 客户端
 2 import socket
 3 
 4 def main():
 5 
 6     # 1,创建套接字
 7 
 8     tcp_client = socket.socket(socket.af_inet, socket.sock_stream)
 9 
10 
11     # 2,链接服务器
12     server_ip = input('获取服务器的ip:')
13     server_port = int(input('获取服务器的端口号:'))
14     tcp_client.connect((server_ip, server_port))
15     print('温馨提示:')
16     print('*'*20)
17     print('如果想要终止下载文件的请求, 请输入“quit”, 退出下载!')
18     while true:   
19         # 3,获取要下载的文件名
20         file_name = input('输入要下载的文件名:')
21         
22         
23 
24         # 4,发送文件名到服务器
25         send_data = tcp_client.send(file_name.encode('utf-8'))
26         
27         if file_name == 'quit':
28             break
29         
30         # 5,接收数据
31         recv_data = tcp_client.recv(1024)
32         if recv_data.decode('utf-8') != '101':
33             # print('接收数据:' ,recv_data.decode('utf-8'))
34             with open('c:\\users\\administrator\\desktop\\练习生\\网络通信\\'+ '[副本]'+file_name, 'wb') as f:
35                 f.write(recv_data)
36         else:
37             print('文件不存在')
38             
39     tcp_client.close()
40 
41 if __name__ == '__main__':
42     main()


 1 import socket
 2 def send_2_client(tcp_client, tcp_addr):
 3 
 4     # 循环为一个客户端服务
 5     while true:    
 6     # 1 接收客服端发送的文件名数据或者接收客户端退出下载的请求(quit)
 7         recv_data = tcp_client.recv(1024)
 8 
 9         file_name = recv_data.decode('utf-8')
10         print('客户端:%s,请求下载的文件:%s' % (str(tcp_addr),file_name))
11 
12     # 退出为当前客服端的下载服务
13         if file_name == 'quit':
14             break
15     # 2 读取文件数据
16     
17         try:
18             f = open(file_name, 'rb')
19             send_content = f.read()
20             f.close()  #关闭文件,释放内存
21         except:
22             print('文件不存在')
23             tcp_client.send('101'.encode('utf-8'))
24             continue #当下载的文件不存在时,循环重新开始,等待客户端发送新的下载请求
25 
26     # 3 发送数据                
27         tcp_client.send(send_content)        
28     tcp_client.close()
29     
30 
31 
32 
33 
34 def main():
35     # 1,创建服务器套接字
36     tcp_server_socket = socket.socket(socket.af_inet, socket.sock_stream)
37 
38     # 2,绑定地址信息
39     tcp_server_socket.bind(('', 7788))
40 
41     # 3,设置为被动监听
42     tcp_server_socket.listen(128)
43 
44     # 4,循环等待客户端的访问
45     # 循环为多个客户端服务
46     while true:
47         print('等待客服端的访问请求...')
48         tcp_client, tcp_addr = tcp_server_socket.accept()
49         send_2_client(tcp_client, tcp_addr)
50     tcp_server_socket.close()
51         
52         
53         
54             
55 if __name__ == '__main__':
56     main()