文件上传下载:
一.文件上传(内容较少)
服务器:(代码)
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. Linux中非正常关闭vi编辑器产生swp文件怎么删除

    Linux中非正常关闭vi编辑器产生swp文件,会导致编辑文件时提示如下内容(图我是从网上找的): 这是因为异常关闭vi编辑器产生swp文件导致,假设编辑的文件名是file.sh,那么生成的swp文件 ...

  2. [Python设计模式] 第26章 千人千面,内在共享——享元模式

    github地址:https://github.com/cheesezh/python_design_patterns 背景 有6个客户想做产品展示网站,其中3个想做成天猫商城那样的"电商风 ...

  3. cmd命令行的ping用法

    1.打开cmd 2.ping 域名    (如:ping baidu.com) 3.输出结果 C:\WINDOWS\system32>ping baidu.com 正在 Ping baidu.c ...

  4. Atitit s2018.5 s5 doc list on com pc.docx  Acc 112237553.docx Acc baidu netdisk.docx Acc csdn 18821766710 attilax main num.docx Atiitt put post 工具 开发工具dev tool test.docx Atiitt 腾讯图像分类相册管家.docx

    Atitit s2018.5 s5  doc list on com pc.docx  Acc  112237553.docx Acc baidu netdisk.docx Acc csdn 1882 ...

  5. python之字符串操作方法

    定义及特性: 以引号(单引号,双引号,三引号)包围且不能修改 a= ' \t aBcdE fgFijDlmNopq rSt uTwxy z 123 !@# \t ' 一.判断字符串,返回bool值:F ...

  6. Get shell By Powershell

    Invoke-PowerShellTcp.ps1 监听主机:nc -nv -l -p 9999 powershell -nop -exec bypass -c "IEX (New-Objec ...

  7. golang字符串拼接

    四种拼接方案: 1,直接用 += 操作符, 直接将多个字符串拼接. 最直观的方法, 不过当数据量非常大时用这种拼接访求是非常低效的. 2,直接用 + 操作符,这个和+=其实一个意思了. 3,用字符串切 ...

  8. vue实例-转载

    http://blog.csdn.net/yuanyuanispeak/article/details/73526795

  9. SparkStreaming+Kafka 处理实时WIFI数据

    业务背景 技术选型 Kafka Producer SparkStreaming 接收Kafka数据流 基于Receiver接收数据 直连方式读取kafka数据 Direct连接示例 使用Zookeep ...

  10. Android 8 蓝牙 扫描流程

    记录android 8 蓝牙扫描设备的流程 src/com/android/settings/bluetooth/BluetoothSettings.java @Override protected ...