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) 小 ...
随机推荐
- javascript日期时间操作库推荐
https://github.com/datejs/Datejs 链接: https://pan.baidu.com/s/1QTGhxslarNyW_0kB6gyJYA 提取码: ibab 如果这篇文 ...
- js object template
//== Class Definition var Test = function() { var login = $('#m_login'); //== Private Functions var ...
- Docker 下载镜像慢的问题解决方法
让你火箭般的速度下载docker镜像! 的冷漠度 百家号17-11-1713:09 因为有墙的原因所以在国内下载docker镜像的速度非常慢,有时候是几kb每秒,那个蛋疼的等待,真是谁等谁知道!下面我 ...
- ES6 与 React
Node和NPM/*安装npm*/npm installnpm install <package>npm install -g <package> /*更新安装包*/npm u ...
- dubbo配置多个注册中心
用法: <dubbo:registry address="zookeeper://10.0.1.131:2181?backup=10.0.1.132:2181,10.0.1.133:2 ...
- IntelliJIdea 2016.2 使用 tomcat 8.5 调试spring的web项目时,bean被实例化两次导致timer和thread被启动了两遍的问题的解决
今天新搭建了一个spring的web项目,项目启动时会启动一个线程,线程里定时执行任务,另外还启动了一个定时器,每秒钟统计系统吞吐量等业务性能数据.但是调试的时候惊奇的发现定时器和线程均被启动了两次. ...
- 安装最新版RabbitMQ v3.7.13 以及基本配置
之前用的老版本,新项目新气象,RabbitMQ也用最新版吧 首先打开官网:http://www.rabbitmq.com/install-rpm.html 先到右侧导航栏来看一下 : 第一个红框是指的 ...
- ASP.NET CORE 中用单元测试测试控制器
之前用ASP.NET CORE做的项目 加了一个新功能,数据库加了个字段balabala.... 更新到服务器上,新功能测试正常,然后就没管了..... 今天客户说网站有BUG,某个页面打开后出错了, ...
- Variable number of arguments (Varargs)
A parameter of a function (normally the last one) may be marked with vararg modifier: fun <T> ...
- windows下telnet命令不好用解决方案;
1.按网上说的windows下打开功能,telnet客户端打钩是必须的: 2.如果还不行,找到telnet.exe:然后把此路径添加到环境变量path下即可: ps:telnet的退出:quit命令: