原版:
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': # 这里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()
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()