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


    原版:

    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()
  • 相关阅读:
    查找大文件的命令
    JavaScript对象参考手册
    Thymeleaf(Java模板引擎)
    C#基础语法补充
    mysql 拾遗提高(函数、事务、索引)
    jQuery总结
    Hibernate (开源对象关系映射框架)
    git的使用命令
    Xpath,XQuery,DTD
    XML DOM(Document Object Model)
  • 原文地址:https://www.cnblogs.com/summer1019/p/10384835.html
Copyright © 2020-2023  润新知