一、FTP 客户端 与服务器端(没有解决黏包问题的代码)

服务器端设置

import socket
import json
ADDR = ('127.0.0.1',)
sk =socket.socket()
sk.bind(ADDR)
sk.listen()
conn,addr =sk.accept() content = conn.recv().decode('utf-8') #接收文件的信息
content_dic =json.loads(content) #将文件信息loads出来形成字典格式.
print(content_dic,type(content_dic)) #打印查看一下loads的内容(字典)
if content_dic['operate'] =='upload':
conn.send(b'received!')
with open(content_dic['file_name'],'wb') as f :#打开新建一个文件,名称和要上传的文件一样,以bytes类型的模式进行bytes类型写操作.
while content_dic['file_size']:#循环,直到文件的大小为0
file = conn.recv() #接收文件每次以1024个byte的大小进行接收.
f.write(file) #将接收到的文件写到创建的文件中
content_dic['file_size']-=len(file) #文件大小每次循环减
conn.close()#关闭链接
sk.close()#关闭 socket对象链接.

客户端设置代码

import socket
import os
import json sk=socket.socket()
ADDR =('127.0.0.1',)
sk.connect(ADDR) def get_filename(file_path):
file_name =os.path.basename(file_path)
return file_name operate =['upload','download']
for num,opt in enumerate(operate,):
print(num,opt) num = int( input("请输入您要进行操作的序号:"))
file_path = input('请输入要传的文件:')
file_size = os.path.getsize(file_path)
file_name =get_filename(file_path) if num==:#上传操作.
dic ={ 'operate': 'upload','file_name':file_name, 'file_size':file_size}
#创建一个字典包括了 操作,文件名,和文件大小.
dic_str =json.dumps(dic)
#将字典进行json操作转换成字符串.
sk.send(dic_str.encode('utf-8'
))
#发送upload的字典信息,包括了文件名,路径和文件大小.
  第一次send(上面代码)
    sk.recv()
with open(file_path,'rb') as f :#打开想要上传的文件,以读的方式.
while file_size:#(判断文件的大小是否非空,直到循环减为空)
content = f.read(1024) #读出文件 1024个字节.
sk.send(content) #将 1024个字节发送到服务器端.
file_size-= len(content) #文件大小减到0 为止,停止循环.   第二次send(上面的代码)

运行结果

二、FTP 上传加入黏包知识点

借助struct模块,我们知道长度数字可以被转换成一个标准大小的4字节数字。因此可以利用这个特点来预先发送数据长度。

发送时 接收时
先发送struct转换好的数据长度4字节 先接受4个字节使用struct转换成数字来获取要接收的数据长度
再发送数据 再按照长度接收数据

服务器端设置

import socket
import json
import struct
ADDR = ('127.0.0.1',8081)
sk =socket.socket()
sk.bind(ADDR)
sk.listen()
conn,addr =sk.accept()
len_4 = conn.recv(4)
len_dic =struct.unpack('i',len_4)[0]#获取到内容的字节大小.
content =conn.recv(len_dic).decode('utf-8')# 在接收内容大小.
content_dic =json.loads(content) #将文件信息loads出来形成字典格式. print(content_dic,type(content_dic)) #打印查看一下loads的内容(字典)
if content_dic['operate'] =='upload':
conn.send(b'received!')
with open(content_dic['file_name'],'wb') as f :#打开新建一个文件,名称和要上传的文件一样,以bytes类型的模式进行bytes类型写操作.
while content_dic['file_size']:#循环,直到文件的大小为0
file = conn.recv(1024) #接收文件每次以1024个byte的大小进行接收.
f.write(file) #将接收到的文件写到创建的文件中
content_dic['file_size']-=len(file) #文件大小每次循环减
conn.close()#关闭链接
sk.close()#关闭 socket对象链

客户端

import socket
import os
import json
import struct sk=socket.socket()
ADDR =('127.0.0.1',8081)
sk.connect(ADDR) def get_filename(file_path):
file_name =os.path.basename(file_path)
return file_name operate =['upload','download']
for num,opt in enumerate(operate,1):
print(num,opt) num = int( input("请输入您要进行操作的序号:"))
file_path = input('请输入要传的文件:')
file_size = os.path.getsize(file_path)
file_name =get_filename(file_path) if num==1:#上传操作.
dic ={ 'operate': 'upload','file_name':file_name, 'file_size':file_size} #创建一个字典包括了 操作,文件名,和文件大小. dic_str =json.dumps(dic).encode('utf-8') #将字典进行json操作转换成字符串. ret =struct.pack('i', len(dic_str))#将字典的大小转换成一个定长的4个字节的大小.
sk.send(ret+dic_str) #将字典的大小和内容发送出去. with open(file_path,'rb') as f :#打开想要上传的文件,以读的方式.
while file_size:#(判断文件的大小是否非空,直到循环减为空)
content = f.read(1024) #读出文件 1024个字节.
sk.send(content) #将 1024个字节发送到服务器端.
file_size-= len(content) #文件大小减到0 为止,停止循环. sk.close()

输出结果:

FTP 作业整理的更多相关文章

  1. Python学习笔记——基础篇【第七周】———FTP作业(面向对象编程进阶 & Socket编程基础)

    FTP作业 本节内容: 面向对象高级语法部分 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 参考:http://www.cnblogs.com/wupeiqi/ ...

  2. python day33 ,socketserver多线程传输,ftp作业

    一.一个服务端连多个客户端的方法 1.服务端 import socketserver class MyServer(socketserver.BaseRequestHandler): def hand ...

  3. python全栈开发day29-网络编程之socket常见方法,socketserver模块,ftp作业

    一.昨日内容回顾 1.arp协议含义 2.子网,子网掩码 3.两台电脑在网络中怎么通信的? 4.tcp和udp socket编码 5.tcp和udp协议的区别 6.tcp三次握手和四次挥手,syn洪攻 ...

  4. python之ftp作业【还未完成】

    作业要求 0.实现用户登陆 1.实现上传和下载 3.每个用户都有自己的家目录,且只可以访问自己的家目录 4.对用户进行磁盘配额,每个用户的空间不同,超过配额不允许下载和上传 5.允许用户在指定的家目录 ...

  5. python day 18: thinking in UML与FTP作业重写

    目录 python day 18 1. thinking in UML读书小感 2. FTP作业重写 2.1 软件目录结构 2.2 FTPClient端脚本 2.3 FTPServer端脚本 pyth ...

  6. C#开发-ftp操作方法整理

    1.整理简化了下C#的ftp操作,方便使用    1.支持创建多级目录    2.批量删除    3.整个目录上传    4.整个目录删除    5.整个目录下载 2.调用方法展示, var ftp ...

  7. [ python ] FTP作业进阶

    作业:开发一个支持多用户在线的FTP程序 要求: 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ,且只能访问自己的家目录 对用户进行磁盘配额,每个用户的可用空间不同 允许用户在ftp se ...

  8. ftp操作方法整理

    1.整理简化了下C#的ftp操作,方便使用    1.支持创建多级目录    2.批量删除    3.整个目录上传    4.整个目录删除    5.整个目录下载 2.调用方法展示, var ftp ...

  9. FTP作业

    实现一个FTP网盘的功能 pa's's

随机推荐

  1. 带你认识那些App可靠性设计

    可靠性是软件一个重要的质量属性,它关注的是软件功能持续的可用性,以及出现故障之后是否能够容错,是否能快速的恢复使用. 可靠性六条基本准则 1.故障应在第一时间被检测和感知: 2.能避免的故障都不应该发 ...

  2. [Jmeter]通过批处理调用java,java从CSV动态读取登录的用户名和密码,并将其作为参数组合成字符串,写入外部.bat文件,然后通过Java执行这个外部批处理文件

    问题1:怎样通过批处理调用java代码? 问题2:怎样通过java从CSV文件获取到用户名和密码存入变量? 问题3:怎样将获取到的用户名和密码组合成字符串,写入外部批处理文件? 问题4:怎样在批处理文 ...

  3. python性能监控初试

    标 题: python性能监控初试作 者: itdef链 接: http://www.cnblogs.com/itdef/p/3990765.html 欢迎转帖 请保持文本完整并注明出处 之前性能统计 ...

  4. vue的过滤器

    Vue.Js 提供了强大的过滤器API,能够对数据进行各种过滤处理,返回需要的结果 vue的过滤器一般在JavaScript 表达式的尾部,由“|”符号指示: 过滤器可以让我们的代码更加优美,一般可以 ...

  5. 给自己名字abel.这个好,怎么字母排序都第一

    给自己名字abel.这个好,怎么字母排序都第一

  6. windows8.1 初体验

    昨天装了Win8.1,Office2013 由于是英文版的,需要装一下中文语言包,然后就能使用自带的微软拼音输入法了. 我喜欢双屏时的桌面背景,选择span时一张图片可以跨越2个屏幕,比win7的好. ...

  7. STAX项目结束总结

    STAX:Support Taxonomy Management Console. 使用了MVC+WCF+jQuery+Azman.msc(权限控制)+kendoUI+SQL SERVER 2012

  8. PythonWEB框架之Flask--2

    10.请求扩展 1 before_request 类比django中间件中的process_request,在青丘收到之前绑定一个函数做一些事情 #基于它做用户登录认证 @app.before_req ...

  9. 2018.09.14 洛谷P3931 SAC E#1 - 一道难题 Tree(树形dp)

    传送门 简单dp题. f[i]表示以i为根的子树被割掉的最小值. 那么有: f[i]=min(∑vf[v],dist(i,fa))" role="presentation" ...

  10. 2018.09.08 NOIP模拟eat(贪心)

    签到水题啊... 这题完全跟图论没有关系. 显然如果确定了哪些点会被选之后顺序已经不重要了.于是我们给点按权值排序贪心从大向小选. 我们要求的显然就是∑i(a[i]−(n−i))" role ...