简易FTP
老男孩----上海校区
简易FTP
客户端端
import socket
import struct
import json
import os
class MYTCPCLIENT:
address_family = socket.AF_INET
socket_type = socket.SOCK_STREAM
allow_reuse_address = False
max_packet_size = 8192
coding ='utf-8'
request_queue_size = 5
def __init__(self,server_address,connect = True):
self.server_address = server_address
self.socket = socket.socket(self.address_family,self.socket_type) if connect:
try:
self.client_connect()
except:
self.client_close()
raise
def client_connect(self):
self.socket.connect(self.server_address) def client_close(self):
self.socket.close() def run(self):
while True:
choice = input(">>>>:").strip()
if not choice:continue
f = choice.split()
cmd=f[0]
if hasattr(self,cmd):
func = getattr(self,cmd)
func(f) def put(self,args):
cmd = args[0]
filename = args[1]
if not os.path.isfile(filename):
print('file:%s is not exists' %filename)
return
else:
filesize = os.path.getsize(filename) head_dic = {'cmd':cmd,'filename':os.path.basename(filename),'filesize':filesize}
head_json=json.dumps(head_dic)
head_json_bytes = bytes(head_json,encoding=self.coding)
head_struce = struct.pack('i',len(head_json_bytes))
self.socket.send(head_struce)
self.socket.send(head_json_bytes)
send_size = 0
with open(filename,'rb') as f:
for line in f:
self.socket.send(line)
send_size+=len(line)
print(send_size)
else:
print('下载成功') client = MYTCPCLIENT(('127.0.0.1',8080))
client.run()
服务端
import socketserver
import struct
import json
import os class FtpServer(socketserver.BaseRequestHandler):
coding='utf-8'
server_dir ='file_upload'
max_packet_size = 1024
BASE_DIR=os.path.dirname(os.path.abspath(__file__))
def handle(self):
print(self.request)
while True:
data = self.request.recv(4)
data_len=struct.unpack('i',data)[0]
head_json= self.request.recv(data_len).decode(self.coding)
head_dic = json.loads(head_json)
cmd = head_dic['cmd']
if hasattr(self,cmd): # 判断这个对象中有没有这个属性
func=getattr(self,cmd) #获取对象属性值
func(head_dic)
def put(self,args):
flie_path = os.path.normpath(os.path.join(
self.BASE_DIR,
self.server_dir,
args['filename']
))
filesize=args['filesize']
recv_size = 0
print('------>',flie_path)
with open(flie_path,'wb') as f:
while recv_size <filesize:
recv_data = self.request.recv(self.max_packet_size)
f.write(recv_data)
recv_size += len(recv_data)
print('recvsize:%s filesize:%s' % (recv_size, filesize))
ftpserver = socketserver.ThreadingTCPServer(('127.0.0.1',8080),FtpServer)
ftpserver.serve_forever()
简易FTP的更多相关文章
- C语言:自己编写的简易ftp客户端,包含(列表,进入目录,上传文件,下载文件,删除文件)功能
//简易ftp客户端#include <stdio.h> #include <string.h> #include <sys/types.h> #include & ...
- Ubuntu 14.10下搭建简易FTP服务器[vsftpd]
Ubuntu下公认最易上手的ftp软件是vsftpd,既然标题都说了是“简易”的,那么必然是用最大众的..下面是正题 目标需求:搭建一个允许匿名/本地登录的FTP,并且支持上传/下载/修改功能,同时F ...
- go语言实现简易ftp客户端
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/xiangxianghehe/article/details/78310249 Go语言实 ...
- c# 基于FTP协议的简易软件自动升级程序
最近在重写了一个老的产品条码扫描程序,客户端数越有30个,因为经常有更新,C/S维护非常不方便,所以做一个自动更新程序特别有必要. 在网上随便找了找自动更新的方案,大多使用VS的发布/更新功能,不太喜 ...
- Linux建立FTP服务器
http://blog.chinaunix.net/uid-20541719-id-1931116.html http://www.cnblogs.com/hnrainll/archive/2011/ ...
- 【树莓派+.NET MF打造视频监控智能车】控制篇(树莓派)
对已经具备一定Linux基础的人来说,树莓派学习起来应该非常简单自然.在他们眼中,树莓派就是一个简易版的,卡通版的Linux而已.但是对我这样一个早已习惯微软技术生态系统的人或者初学者来说,要实现一个 ...
- 如何在Cent OS上安装和部署jdk与tomcat?
Cent OS是一款Linux系统.在商业应用中,Linux操作系统在服务器市场有着广泛的运用,这源于Linux系统的几大优点: 1.跨平台的硬件支持 由于Linux 的内核大部分是用C 语言编写的, ...
- 打通 DevOps 任督二脉 ,CODING 2.0 制品库全新上线
CODING 在近期的 KubeCon 2019 大会上发布了 CODING 2.0,同时发布了最新功能--制品库.CODING 不断完善 DevOps 工具链,旨在持续提升研发组织软件交付的速度与质 ...
- FTP服务器简易有效的访问方法
访问FTP服务器传统的方法是使用专用的客户端程序,如CuteFTP,8UFTP等,也包括命令行的FTP客户端c:\windows\system32\ftp.exe程序. FTP服务器也有简易访问方法 ...
- day-1 用python编写一个简易的FTP服务器
从某宝上购买了一份<Python神经网络深度学习>课程,按照视频教程,用python语言,写了一个简易的FTP服务端和客户端程序,以前也用C++写过聊天程序,编程思路差不多,但是pytho ...
随机推荐
- 新手搭建Git与项目整合
新手搭建Git,将代码托管到码云 如果你还没有使用过Git,首先先去https://gitee.com/注册一个自己的账户,然后在https://git-scm.com/下载一个客户端(提交代码到码云 ...
- 关于elementui 验证问题 验证某个值大于另外一个值
elementui ui表单验证区间 <el-form ref="ruleForm" :model="ruleForm" :rules="rul ...
- java实现读取json文件指定字段值
使用场景 现有一个大数据的json文件,每条数据有多层数据信息.现在想把其中某个字段提取并叠加计算. json文件格式 1 { 2 "MsgID":"111", ...
- scrollIntoView()方法将元素滚动到浏览器窗口的可见区域
TIPS:容器可滚动时才有用! 语法 element.scrollIntoView(); // 等同于element.scrollIntoView(true) element.scrollIntoVi ...
- spring 创建 bean 的 几种方式
Spring 创建 bean 有 多种方式: 自动创建,手动创建注入: 方式1: 使用 Spring XML 配置: <bean id=''id class=''class / > 方式 ...
- SQL数学函数学习
笔记来自如鹏网杨中科老师所著的 <程序员的SQL金典>#创建数据库表 CREATE Table T_Person ( FIdNumber VARCHAR(20), FName varcha ...
- C语言源文件如何编译为exe
先观看https://blog.csdn.net/u014772182/article/details/43348465来配置gcc环境随后在cmd中cd到目标文件夹gcc main.c -o ste ...
- 使用docker 创建6节点redis 集群 RedisCluster redis集群
1.RedisCluster 特点(3主节点redis 集群 及6节点集群) 1.无中心节点,客户端与redis 节点直连,不需要中间代理,(有选举机制 master个数需要奇数个) 2.数据可以被 ...
- 基于Vue项目+django写一个登录的页面
基于Vue项目+django写一个登录的页面 前端 借用了一下vue项目模板的AboutView.vue 页面组件 <template> <div class="about ...
- 软件工程日报八——AlertDiatog的使用
今天学习了AlertDiatog的相关内容 AlertDialog可以在当前的界面上显示一个对话框,这个对话框是置顶于所有界面元素之上的,能够屏蔽掉其他控件的交互能力,因此AlertDialog一般是 ...