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

2020-01-17 16:56:11 浏览数 (1)

原版:

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

改良版:

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

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

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

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

难点:

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

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

自学自练,欢迎指正。

代码语言:javascript复制
 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':  # 这里if判断语句要放置在send_data之后,让客户端把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()

代码语言:javascript复制
 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()

0 人点赞