文件上传下载:
一.文件上传(内容较少)
服务器:(代码)
import socket
import json
sk=socket.socket()
sk.bind(("127.0.0.1",8807)) 绑定
sk.listen() 监听
conn,addr=sk.accept() 接收
dic_str=conn.recv(1024).decode("utf-8") 收到信息并解码 字典(客户选择的项目,文件名,内容)
dic=json.loads(dic_str) 将信息反序列化
if dic["opt"]=="upload": 如果是客户选择"上传"
file_name="1"+dic["file_name"] 文件名稍作修改,加以区分
with open(file_name,"w",encoding="utf-8")as f: 打开文件,设置成写模式
f.write(dic["content"]) 把接收到的文件内容写入文件中
elif dic["opt"]=="download":
"给客户传文件"
pass
conn.close()
sk.close() 客户端代码:
import socket
import os
import json
sk=socket.socket()
sk.connect(("127.0.0.1",8807))
l=["upload","download"]
for k,v in enumerate(l):
print(k+1,v)
dic={"opt":None,"file_name":None,"content":None} while 1:
opt=input("请输入功能选项:")
if opt=="1":
file_dir=input("文件路径")
file_name=os.path.basename(file_dir) #通过文件路径获取文件名
with open(file_name,"r",encoding="utf-8")as f:
content=f.read() #读取全部文件内容
dic["opt"]=l[int(opt)-1] #客户选择的项目
dic["file_name"]=file_name #文件名
dic["content"]=content #文件内容
dic_str=json.dumps(dic) #把填充好的字典用json模块进行序列化 json 的作用就是用于网络传输,写入文件
sk.send(dic_str.encode("utf-8")) #对序列化好的字典字符串进行编码并发送给服务器.(客户选的项目,文件名,文件内容)
elif opt=="2":
"download"
pass
else:
print("输入有误")
conn.close() 二.文件上传(内容较多"粘包")
服务器(代码)
import socket
import json
import struct
sk=socket.socket()
sk.bind(("127.0.0.1",8807))
sk.listen()
conn,addr=sk.accept()
dic_size=conn.recv(4)
dic_size=struct.unpack("i",dic_size)
dic_str=conn.recv(dic_size).decode("utf-8")
dic=json.loads(dic_str)
if dic["opt"]=="upload":
file_name="1"+dic["file_name"]
with open(file_name,"wb")as f:
while dic["filesize"]:
content=conn.recv(1024)
f.write(content)
dic["filesize"]=dic["filesize"]-len(content)
elif dic["opt"]=="download":
"给客户传文件"
pass
conn.close()
sk.close()
客户端(代码)
import socket
import os
import json
import struct
sk=socket.socket()
sk.connect(("127.0.0.1",8807))
l=["upload","download"]
for k,v in enumerate(l):
print(k+1,v)
dic={"opt":None,"file_name":None,"file_size":None} # 选项,文件名,文件大小
while 1:
opt=input("请输入功能选项:")
if opt=="1":
file_dir=input("文件路径") #输入文件路径
file_name=os.path.basename(file_dir) # 已知文件路径用os.path.basename获取文件名
file_size=os.path.getsize(file_name) # 用os.path.getsize方法获取文件大小 dic["opt"]=l[int(opt)-1] #完善字典内容
dic["file_name"]=file_name
dic["filesize"]=file_size
dic_str=json.dumps(dic) #用json模块对字典进行序列化
dic_size=len(dic_str) #获取序列化后的字典的大小
ds=struct.pack("i",dic_size) #用struct模块将字典的字典大小转化成固定长度的字节(四字节) sk.send(ds+dic_str.encode("utf-8")) #将转化成的固定字节,对序列化成的字典编码形式发送给服务器
with open(file_dir,"rb")as f: #打开文件(用文件的绝对路径) 读取字节模式读取内容
while file_size: #文件里面有内容,则自行循环体
content=f.read(1024) # 一次读取1024个字节
sk.send(content) #读取一次就发送一次
file_size=file_size-len(content) #发送一次,文件大小就减少一次,减少量为发送内容的大小.(不可减1024,因为不能保证最后一次一定够1024 字节) elif opt=="2":
"download"
pass
else:
print("输入有误")
conn.close() 三.文件下载(内容较多"粘包")
服务器代码
import socket
import json
import os
import struct
sk = socket.socket()
sk.bind(('127.0.0.1',9090))
sk.listen()
dic1={"opt":None,"file_name":None,"file_size":None}
conn,addr = sk.accept()
dic_str = conn.recv(1024).decode('utf-8')
dic = json.loads(dic_str)# 反序列化 得到字典 opt filename content
print(dic)
if dic['opt'] == 'upload': filename = '1'+dic['filename']# 将文件名字修改,防止重名
with open(filename,'w',encoding='utf-8') as f:
f.write(dic['content'])
elif dic["opt"] == 'download':
# with open (dic["file_name"],encoding="utf-8")as f:
# content=f.read()
print(dic["file_name"])
file_size=os.path.getsize(dic["file_name"])
# print(file_size)
file_name = dic["file_name"] + "1"
dic1["file_name"]=file_name
dic1["file_size"]=file_size
# print(dic1)
dic_str=json.dumps(dic1)
# print(dic_str)
dic_size=len(dic_str)
ds=struct.pack('i',dic_size)
# print(dic["file_name"])
conn.send(ds+dic_str.encode("utf-8"))
with open (dic["file_name"],"rb")as f:
while file_size:
content=f.read(1024)
conn.send(content)
file_size=file_size-len(content) conn.close()
sk.close() 客户端代码:
import socket
import os
import json
import struct sk = socket.socket()
sk.connect(("127.0.0.1", 9090))
l = ["upload", "download"]
for k, v in enumerate(l):
print(k + 1, v)
dic = {"opt": None, "file_name": None, "file_size": None} while 1:
opt = input("请输入功能选项:")
if opt == "1":
file_dir = input("文件路径")
file_name = os.path.basename(file_dir) # 通过文件路径获取文件名
with open(file_name, "r", encoding="utf-8")as f:
content = f.read() # 读取全部文件内容
dic["opt"] = l[int(opt) - 1] # 客户选择的项目
dic["file_name"] = file_name # 文件名
dic["content"] = content # 文件内容
dic_str = json.dumps(dic) # 把填充好的字典用json模块进行序列化 json 的作用就是用于网络传输,写入文件
sk.send(dic_str.encode("utf-8")) # 对序列化好的字典字符串进行编码并发送给服务器.(客户选的项目,文件名,文件内容)
elif opt == "2":
file_name=input("请输入文件名:")
dic["opt"] = l[int(opt) - 1] # 客户选择的项目
dic["file_name"] = file_name # 文件名 dic_str=json.dumps(dic)
sk.send(dic_str.encode("utf-8"))
dic_size=sk.recv(4)
dic_size=struct.unpack("i",dic_size)
# print(dic_size)
dic1_str=sk.recv(dic_size[0]).decode("utf-8")
# print(dic1_str)
dic1=json.loads(dic1_str)
# print(dic1["file_name"])
# print( dic1["file_size"])
with open(dic1["file_name"],mode="wb")as f:
while dic1["file_size"]:
content=sk.recv(1024)
# print(content)
f.write(content)
dic1["file_size"]=dic1["file_size"]-len(content)
else:
print("输入有误")
conn.close() struct模块
import struct
s="3344556677"
s_size=len(s)
r=struct.pack("i",s_size)
print(r) # b'\x0c\x00\x00\x00'
r1=struct.unpack("i",r)
print(r1) # (10,)

python全栈开发 * 34知识点汇总 * 180719的更多相关文章

  1. python全栈开发 * 10知识点汇总 * 180612

    10 函数进阶 知识点汇总 一.动态参数 形参的第三种1.动态接收位置传参 表达:*args (在参数位置编写 * 表⽰接收任意内容) (1)动态位置参数def eat(*args): print(a ...

  2. python全栈开发 * 01知识点汇总 * 180530

    一 python简介. 1.创始人:  吉多 .范罗苏姆  \   (Guido van Rossum). 2.时间  :  1989年. 3.主要应用领域  :  云计算 \  WEB开发  \   ...

  3. python全栈开发 * 32知识点汇总 * 180717

    32 网络编程 (一)一.架构 定义:程序员开发的一种模式. 分类: C/S 架构 C/S即:Client与Server , 客户端/ 服务器模式 . 缺点 : 冗余 B/S 架构 Browser与S ...

  4. python全栈开发 * 26知识点汇总 * 180709

    26 logging collections random 模块 一.logging低配:日志不能写入文件与显示同时进行 import logging logging.basicConfig(leve ...

  5. python全栈开发 * 12 知识点汇总 * 180530

    12 知识点总结 装饰器进阶 ⼀. 通⽤装饰器的回顾1.开闭原则: 对增加功能开放. 对修改代码封闭2.装饰器的作⽤: 在不改变原有代码的基础上给⼀个函数增加功能3.通⽤装饰器的写法:def wrap ...

  6. python全栈开发 * 36知识点汇总 * 180721

    36 操作系统的发展史 进程一.手工操作--穿孔卡片 1.内容: 程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存,接着通过控制 台开关启动程序针对 ...

  7. python全栈开发 * 31知识点汇总 * 180716

    31 模块和包一.模块(一)模块的种类:内置模块,自定义模块,扩展模块第三方模块(二)自定义模块 1.模块的创建 : 新建一个py文件. 2.模块名 : 模块名需要符合变量的命名规范. 3.模块的导入 ...

  8. python全栈开发 * 24 知识点汇总 * 180705

    24 模块-------序列化一.什么是模块 模块:py文件就是一个模块.二.模块的分类:(1)内置模块 (登录模块,时间模块,sys模块,os模块)(2)扩展模块 (itchat 微信有关,爬虫,b ...

  9. python全栈开发 * 27知识点汇总 * 180710

    27   time  os  sys  模块 time 模块 一.表示时间的三种方式 时间戳(timestamp), 元组(struct_time),格式化时间字符串(Format string) 小 ...

随机推荐

  1. 如何永久激活(破解) IntelliJ IDEA 2018.2

    1.去官网下载并安装 idea 地址:https://www.jetbrains.com/idea/download 文件有点大,耐心等待一会儿. 2.下载破解(crack) jar 包 地址 htt ...

  2. 使用 Docker 镜像构建 GO 语言环境

    1. 安装 Docker 我当前使用的系统环境是 CentOS7 ,安装 Docker 使用的命令是 yum install docker*.至于其它系统,可以到百度查找其对应的安装方式. 2. 配置 ...

  3. 超简单的okHttpUtils封装(下)

      版权声明:转载请注明出处:http://blog.csdn.net/piaomiao8179 https://blog.csdn.net/piaomiao8179/article/details/ ...

  4. oracle 函数 输入值,查询数据,返回相应处理结果

    create or replace function FUN_SEARCH_ORDERBY ( INSTACEID in varchar2,TYE IN varchar2) return varcha ...

  5. paste

    echo "step 1" >> steplog.txt    echo "step 1"        sudo apt-get install ...

  6. crontab命令详解

    一. Crontab 介绍 1.crontab命令的功能是在一定的时间间隔调度一些命令的执行,我理解为windows下的任务计划. 2./etc/crontab 文件 在/etc目录下有一个cront ...

  7. 使用JavaScript验证用户输入的是否为正整数

    在项目开发中,需要使用JavaScript验证用户输入的是否为正整数. 方法一: var type="^[0-9]*[1-9][0-9]*$"; var r=new RegExp( ...

  8. 把去世的亲友做成聊天机器人,就能让生者慰藉、死者安息吗? - 看了 寻梦历险记,我的回答是 :是的,他/她永远活在我们心里 www.iremember.com.cn

    AppU 如今的我们,之所以离不开手机和互联网,是因为它们确实可以带来信息和方便,让我们轻松记录并分享自己的生活体验,留下了充满回忆的各种文字.语音,各种图片.视频…… 但你有没有想过,当我们逝世时, ...

  9. (转)x264的一些参数设置对编码效率的影响

    转自:http://www.cnblogs.com/wainiwann/p/5647521.html i_luma_deadzone[0]和i_luma_deadzone[1]分别对应inter和in ...

  10. 干货 | Ansible 上手指南

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/O4dC8OjO7ZL6/article/details/79765539 点击上方"中兴开 ...