zoukankan      html  css  js  c++  java
  • ftp上传小示例

    客户端

     1 import socket
     2 import os
     3 import json
     4 import struct
     5 #上传文件即发送我的数据,服务端来保存,保存的时候需要按照我的描述信息来
     6 #所以需要先发送文件的描述信息:文件名和文件大小
     7 
     8 client = socket.socket()
     9 client.connect(('121.195.167.34',8004))
    10 
    11 file_size = os.path.getsize(r'E:ilibili下载老男孩所有正式项目粘包解决2服务端.py')
    12 
    13 #先发送文件的描述信息:文件名和文件大小
    14 file_info = {'filename':'粘包解决2服务端.py',
    15              'file_size':file_size}
    16 
    17 #发送需要bytes,字典无法直接过去,需要json先转成json字符串再把字符串转bytes
    18 file_str = json.dumps(file_info)
    19 file_info_bytes = file_str.encode('utf-8')
    20 
    21 #为了防止粘包,先把文件描述信息的长度打包成4字节长度的内容,
    22 #再把这个4字节内容和真正的文件的描述信息打包发送
    23 info_len = len(file_info_bytes)
    24 info_len_struct = struct.pack('i',info_len)
    25 client.send(info_len_struct + file_info_bytes)
    26 
    27 
    28 #准备发送文件真实数据,因为此时服务端已经准备好了接受文件信息里提到的文件长度
    29 sum = 0
    30 with open('粘包解决2服务端.py','rb') as f:
    31     while sum < file_size:   #循环结束条件
    32         #每次读取的长度
    33         every_read = f.read(5)
    34         sum += len(every_read)
    35         client.send(every_read)
    36         #累加统计文件每次读取的累计值

    服务端

     1 import socket
     2 import struct
     3 import json
     4 
     5 server = socket.socket()
     6 server.bind(('121.195.167.34',8004))
     7 server.listen()
     8 conn,addr = server.accept()
     9 
    10 #首先接受描述信息的长度
    11 file_struct = conn.recv(4)
    12 file_info_len = struct.unpack('i',file_struct)[0]
    13 
    14 
    15 #接受对应的长度的内容,将其转化为字典模式的描述信息
    16 file_info_bytes = conn.recv(file_info_len)
    17 file_info_json = file_info_bytes.decode('utf-8')
    18 file_info = json.loads(file_info_json)
    19 21 recv_sum = 0
    22 
    23 file_path = 'E:\bilibili下载'+ '\' + file_info['filename']
    24 
    25 with open(file_path,'wb') as f:
    26     while recv_sum < file_info['file_size']:
    27         every_recv = conn.recv(5)
    28         f.write(every_recv)
    29         recv_sum += len(every_recv)
  • 相关阅读:
    java学习日记-------------------------------------贪吃蛇
    java学习日记----------------为窗口添加背景图
    java学习日记-----------------------------弹弹球
    java学习日记----------------------封装的日期类MyDate
    java 学习日记---------简易学生信息管理系统
    第九次作业
    第八次作业
    第七次作业
    第六次作业
    第五次作业
  • 原文地址:https://www.cnblogs.com/shachengcc1/p/11293868.html
Copyright © 2011-2022 走看看