• python socketserver ftp上传功能


    一.socketserver用于多个客户端访问同一个服务端

    客户端

     1 import socket
     2 
     3 client = socket.socket()
     4 
     5 ip_port = ('127.0.0.1',8001)
     6 
     7 client.connect(ip_port)
     8 
     9 while 1:
    10     msg = input('客户端说>>>')
    11 
    12     client.send(msg.encode('utf-8'))
    13 
    14     from_server_msg = client.recv(1024)
    15 
    16     print(from_server_msg.decode('utf-8'))

    服务端

     1 import socketserver
     2 
     3 class Myserver(socketserver.BaseRequestHandler):
     4 
     5     def handle(self):
     6         while 1:
     7             from_client_msg = self.request.recv(1024)
     8 
     9             print(from_client_msg.decode('utf-8'))
    10             msg = input('服务端说:')
    11             self.request.send(msg.encode('utf-8'))
    12 
    13 
    14 if __name__ == '__main__':
    15 
    16     ip_port = ('127.0.0.1',8001)
    17 
    18     server = socketserver.ThreadingTCPServer(ip_port,Myserver)
    19 
    20     server.serve_forever()

    二.ftp上传
    客户端

     1 import os
     2 import socket
     3 import  json
     4 import struct
     5 
     6 client = socket.socket()
     7 ip_port = ('127.0.0.1', 8001)
     8 client.connect(ip_port)
     9 
    10 # 统计文件大小
    11 file_size = os.path.getsize(r'D:python_workspace_s18day 29socketserver ftp功能简单讲解aaa.mp4')
    12 
    13 # 统计文件描述信息,给服务端,服务端按照我的文件描述信息来保存文件,命名文件等等,现在放到一个字典里面了
    14 file_info = {
    15     'file_name': 'aaa.mp4',
    16     'file_size':file_size
    17 }
    18 
    19 # 由于字典无法直接转换成bytes类型的数据,所以需要json来讲字典转换为json字符串,在吧字符串转换为字节类型的数据进行发送
    20 
    21 # json.dumps是将字典转换成json字符串的方法
    22 file_info_json = json.dumps(file_info)
    23 
    24 # 将字符串转换成bytes类型的数据
    25 file_info_byte = file_info_json.encode('utf-8')
    26 
    27 # 为了防止黏包现象,将文件描述信息的长度打包后和文件的描述信息的数据一起发送过去
    28 data_len = len(file_info_byte)
    29 data_len_struct = struct.pack('i',data_len)
    30 
    31 # 发送文件描述信息
    32 client.send(data_len_struct + file_info_byte)
    33 
    34 
    35 # 定义一个变量 = 0 ,作为每次读取文件长度的累计值
    36 sum = 0
    37 
    38 with open('aaa.mp4','rb') as f:
    39     while file_size > sum:
    40         # 每次读取的文件内容,每次读取1024B大小的数据
    41         erver_read_data = f.read(1024)
    42         # 将sum累加,统计长度
    43         sum += len(erver_read_data)
    44         # 将每次读取的文件的真实数据发送给服务端
    45         client.send(erver_read_data)

    服务端

     1 import json
     2 import socket
     3 import struct
     4 
     5 server = socket.socket()
     6 
     7 ip_port = ('127.0.0.1', 8001)
     8 
     9 server.bind(ip_port)
    10 
    11 server.listen()
    12 
    13 conn,addr = server.accept()
    14 
    15 # 首先接收文件的描述信息的长度
    16 struct_data_len = conn.recv(4)
    17 data_len = struct.unpack('i', struct_data_len)[0]
    18 
    19 # 打印长度
    20 print('data_len',data_len)
    21 
    22 # 通过文件信息的长度将文件描述信息全部接收
    23 file_info_bytes = conn.recv(data_len)
    24 
    25 # 将文件描述信息转换为字典类型,以便操作
    26 
    27 file_info_json =file_info_bytes.decode('utf-8')
    28 
    29 # 将字符串转换成字典
    30 file_info_dict = json.loads(file_info_json)
    31 
    32 # 打印字典
    33 print(file_info_dict)
    34 
    35 # 统计每次接收的累积长度
    36 recv_sum = 0
    37 
    38 #根据文件描述信息,指定文件路径和文件名称
    39 file_path = 'D:python_workspace_s18day 29socketserver ftp功能简单讲解jj' + '\' + file_info_dict['file_name']
    40 
    41 
    42 #接收文件的真实数据
    43 with open(file_path,'wb') as f:
    44     # 循环接收,循环结束的依据是文件描述信息中文件的大小,也是通过一个初始值为0的变量来统计
    45     while file_info_dict['file_size'] > recv_sum:
    46         every_recv_data = conn.recv(1024)
    47         recv_sum +=len(every_recv_data)
    48         f.write(every_recv_data)
  • 相关阅读:
    ibatis常用sql
    在eclipse中部署maven项目的问题
    如何成为一个设计师和程序员混合型人才
    一个程序员的读书笔记:程序设计的反思
    C# 中的 == 和 equals()有什么区别?
    2014百度之星资格赛解题报告:能量变换
    2014百度之星资格赛解题报告:Xor Sum
    2014百度之星资格赛解题报告:Labyrinth
    那些年我们一起追过的ACM
    最新全球排名前50网站前端开发语言统计
  • 原文地址:https://www.cnblogs.com/beargod/p/10235128.html
Copyright © 2020-2023  润新知