python全栈开发 * 34知识点汇总 * 180719
文件上传下载:
一.文件上传(内容较少)
服务器:(代码)
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的更多相关文章
- python全栈开发 * 10知识点汇总 * 180612
10 函数进阶 知识点汇总 一.动态参数 形参的第三种1.动态接收位置传参 表达:*args (在参数位置编写 * 表⽰接收任意内容) (1)动态位置参数def eat(*args): print(a ...
- python全栈开发 * 01知识点汇总 * 180530
一 python简介. 1.创始人: 吉多 .范罗苏姆 \ (Guido van Rossum). 2.时间 : 1989年. 3.主要应用领域 : 云计算 \ WEB开发 \ ...
- python全栈开发 * 32知识点汇总 * 180717
32 网络编程 (一)一.架构 定义:程序员开发的一种模式. 分类: C/S 架构 C/S即:Client与Server , 客户端/ 服务器模式 . 缺点 : 冗余 B/S 架构 Browser与S ...
- python全栈开发 * 26知识点汇总 * 180709
26 logging collections random 模块 一.logging低配:日志不能写入文件与显示同时进行 import logging logging.basicConfig(leve ...
- python全栈开发 * 12 知识点汇总 * 180530
12 知识点总结 装饰器进阶 ⼀. 通⽤装饰器的回顾1.开闭原则: 对增加功能开放. 对修改代码封闭2.装饰器的作⽤: 在不改变原有代码的基础上给⼀个函数增加功能3.通⽤装饰器的写法:def wrap ...
- python全栈开发 * 36知识点汇总 * 180721
36 操作系统的发展史 进程一.手工操作--穿孔卡片 1.内容: 程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存,接着通过控制 台开关启动程序针对 ...
- python全栈开发 * 31知识点汇总 * 180716
31 模块和包一.模块(一)模块的种类:内置模块,自定义模块,扩展模块第三方模块(二)自定义模块 1.模块的创建 : 新建一个py文件. 2.模块名 : 模块名需要符合变量的命名规范. 3.模块的导入 ...
- python全栈开发 * 24 知识点汇总 * 180705
24 模块-------序列化一.什么是模块 模块:py文件就是一个模块.二.模块的分类:(1)内置模块 (登录模块,时间模块,sys模块,os模块)(2)扩展模块 (itchat 微信有关,爬虫,b ...
- python全栈开发 * 27知识点汇总 * 180710
27 time os sys 模块 time 模块 一.表示时间的三种方式 时间戳(timestamp), 元组(struct_time),格式化时间字符串(Format string) 小 ...
随机推荐
- 关于ProgressDialog.show抛出android.view.WindowManager$BadTokenException: Unable to add window
下午摆弄ProgressDialog,进入就抛错:android.view.WindowManager$BadTokenException: Unable to add window -- token ...
- [Python设计模式] 第19章 分公司=部门?——组合模式
github地址:https://github.com/cheesezh/python_design_patterns 组合模式 组合模式,将对象组合成树形结构以表示"部分-整体" ...
- 查看SQL Server的版本及License
select @@VERSION Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64) Jun 28 2012 08:36:30 Copyri ...
- C# 图解视频教程 全集200多集
观看地址 https://www.bilibili.com/video/av21896829/?spm_id_from=333.23.home_video_list.3 学习交流地址 http://w ...
- 配置logback
相关组件] Logback是由log4j创始人设计的又一个开源日志组件. logback当前分成三个模块:logback-core.logback- classic和logback-access. l ...
- Spark 精品文章转载(目录)
学习 Spark 中,别人整理不错的文章,转载至本博客,方便自己学习,并按照不同的模块归档整理.每个文章作者能力不同,写文章所处的时间点不同,可能会略有差异,在阅读的同时,注意当时的文章的内容是否已经 ...
- Spark的历史与发展(目录)
对于一个具有相当技术门槛与复杂度的平台,Spark从诞生到正式版本的成熟,经历的时间如此之短,让人感到惊诧.2009年,Spark诞生于伯克利大学AMPLab,最开初属于伯克利大学的研究性项目.它于2 ...
- 【Unity】UGUI聊天消息气泡 随文本内容自适应
游戏中需要用做UGUI做聊天界面.其中聊天气泡ChatItem的UI要求能随着聊天内容文本的长度自适应的. 网上搜了一下聊天气泡的UI,发现都不太符合咱的需求,具体来说是文本宽度不足一行时,文本宽度自 ...
- 【转】C# 高性能 TCP 服务的多种实现方式
原文链接: http://www.cnblogs.com/gaochundong/p/csharp_tcp_service_models.html 开源库: https://github.com/ga ...
- 聊天机器人(chatbot)终极指南:自然语言处理(NLP)和深度机器学习(Deep Machine Learning)
在过去的几个月中,我一直在收集自然语言处理(NLP)以及如何将NLP和深度学习(Deep Learning)应用到聊天机器人(Chatbots)方面的最好的资料. 时不时地我会发现一个出色的资源,因此 ...