网络编程- struct模块定制报头ftp实践(九)

一、server端import jsonimport structimport socket

sk = socket.socket()sk.bind((‘127.0.0.1‘,8080))sk.listen()

conn,addr = sk.accept()dic_len = conn.recv(4)  # 4个字节 数字的大小dic_len = struct.unpack(‘i‘,dic_len)[0]content = conn.recv(dic_len).decode(‘utf-8‘)  # 70content_dic = json.loads(content)if content_dic[‘operate‘] == ‘upload‘:    with open(content_dic[‘filename‘],‘wb‘) as f:        while content_dic[‘filesize‘]:            file = conn.recv(1024)            f.write(file)            content_dic[‘filesize‘] -= len(file)conn.close()sk.close() 

client端import osimport jsonimport structimport socket

sk = socket.socket()sk.connect((‘127.0.0.1‘,8080))

def get_filename(file_path):    filename = os.path.basename(file_path)    return filename

#选择 操作operate = [‘upload‘,‘download‘]for num,opt in enumerate(operate,1):    print(num,opt)num = int(input(‘请输入您要做的操作序号 : ‘))if num == 1:    ‘‘‘上传操作‘‘‘    file_path = input(‘请输入要上传的文件路径 : ‘)    file_size = os.path.getsize(file_path)  # 获取文件大小    file_name = get_filename(file_path)    dic = {‘operate‘: ‘upload‘, ‘filename‘: file_name,‘filesize‘:file_size}    str_dic = json.dumps(dic).encode(‘utf-8‘)    ret = struct.pack(‘i‘, len(str_dic))  # 将字典的大小转换成一个定长(4)的bytes    sk.send(ret + str_dic)    with open(file_path,‘rb‘) as  f:        while file_size:            content = f.read(1024)            sk.send(content)            file_size -= len(content)elif num == 2:    ‘‘‘下载操作‘‘‘sk.close()

二、win系统下传每次buffer=4096有报错情况猜测(改成1024解决)修改前
server端(buffer=4096)第二个head_len的后面加[0]获取元组第一个数

client端


 
修改后server端(buffer=1024)

client端(buffer改成1024)

 



原文地址:https://www.cnblogs.com/mys6/p/10799822.html

时间: 2024-08-30 07:28:30

网络编程- struct模块定制报头ftp实践(九)的相关文章

网络编程- strcuct模块定制报头的理论(八)

合一起发也是一样效果,也会遵守协议,先接收四个字节 原文地址:https://www.cnblogs.com/mys6/p/10799595.html

Python网络编程—struct模块的使用

struct模块的使用 1.原理: 将一组简单数据进行打包,转换为bytes格式发送.或者将一组bytes格式数据,进行解析. 2.接口使用 Struct(fmt) 功能: 生成结构化对象 参数:fmt 定制的数据结构 st.pack(v1,v2,v3....) 功能: 将一组数据按照指定格式打包转换为bytes 参数:要打包的数据 返回值: bytes字节串 st.unpack(bytes_data) 功能: 将bytes字节串按照指定的格式解析 参数: 要解析的字节串 返回值: 解析后的内容

python网络编程socket模块实现ftp上传下载

本实验实现ftp上传文件下载文件功能,并具有校验文件完整性,打印进度条功能, 主要练习socket,struct模块. ftp用户文件存放在user.json文件中 user.json文件内容 {"lisi": "abcdef", "hyh": "123456"} ftp客户端脚本ftpclient.py #!/usr/bin/python # --*-- coding: utf-8 --*-- import socket i

网络编程与模块相关

BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层模型 互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层 每层运行常见物理设备 详细参考: http://www.cnblogs.com/linhaifeng/articles/5937962.html#_label4 学习socket一定要先学习互联网协议: 1.首先:本节课程的目标就是教会你如何

Python2与Python3的区别/网络编程/socketserver模块中的多线程

一.知识点补充: 1.解释型语言和编译型语言 编译型(目前有两种解释): 先把代码编译成机器码 -> 机器寄存器去运行 :C语言 先把代码编译成XXX -> 计算机找虚拟机执行代码 -> 机器码交给计算机去执行 :C语言,JAVA,C# 解释型: 边解释边执行 2.Python中的作用域 Python中的函数是一个作用域 3.这里规定一下以后写元组的格式: v = (1,2,3,) 1.Python中函数是一个作用域 i=0 for i in range(10): pass print(

Javascript模块化编程(一)模块的写法最佳实践六、输入全局变量 独立性是模块的重要特点,模块内部最好不与程序的其他部分直接交互。 为了在模块内部调用全局变量,必须显式地将其他变量输入模块。

Javascript模块化编程,已经成为一个迫切的需求.理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块但是,Javascript不是一种模块化编程语言,它不支持类class,更遑论模块module了 随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂.网页越来越像桌面程序,需要一个团队分工协作.进度管理.单元测试等等......开发者不得不使用软件工程的方法,管理网页的业务逻辑. Javascript模块化编程,已

网络编程socket模块

套接字的地址家族(AF, Address Family)分为2种,一种是基于文件的AF_UNIX,一种是基于网络的AF_INET,:套接字的类型有2种,面向连接的套接字SOCK_STREAM和无连接的套接字SOCK_DGRAM. UDP常用的模块有3个: (1) socket([family[, type[proto]]]) (2) sendto(string,address) (3) recvfrom(bufsize[, flags]) 收发UDP数据,接收到的是data,address TC

python学习笔记8:网络编程--requests模块

python操作网络,也就是打开一个网站,或者请求一个http接口. 使用requests模块,pip install requests 安装即可. requests 模块是基于urllib模块进行开发的,urllib用起来比较麻烦:传参数的话,都得是bytes类型,返回数据也是bytes类型,还得解码.所以我直接丢弃之 一.打开一个网站 二.请求一个接口 1.key-value传参的接口 2.json传参的接口 3.要添加cookie的接口 4.要加header的接口 5.要加权限的接口

python网络编程----requests模块

python访问网站可以用标准模块--urllib模块(这里省略),和requests(安装-pip install requests)模块,requests模块是在urllib的基础上进行的封装,比urllib模块功能更强到,易用 import json,requests #发送get请求 url = 'http://api.nnzhp.cn/api/user/stu_info?stu_name=小黑马' req = requests.get(url) #发送get请求 print(req.t