socket实现FTP上传下载功能
'''服务器端'''
1 _author__ = "Dbass"
import socketserver
import json,os
class MyTCPHandler(socketserver.BaseRequestHandler):
def get(self,*args):
'''发送客户端请求的文件'''
cmd_dic= args[0]
filename=cmd_dic["filename"]
self.request.send(b"200 ok")
if os.path.isfile(filename):
filesize = str(os.stat(filename).st_size)
print(type(filesize))
self.request.send(filesize.encode("utf-8"))
self.request.send(b"size ok")
f = open(filename, "rb")
for line in f:
self.request.send(line)
else:
print(filename, "is not exist") def put(self,*args):
'''接收客户端文件'''
cmd_dic = args[0]
filename = cmd_dic["filename"]
filesize = cmd_dic["size"]
if os.path.isfile(filename):
f = open(filename + ".new","wb")
else:
f = open(filename , "wb") self.request.send(b"200 ok")
received_size = 0
while received_size < filesize:
data = self.request.recv(1024)
f.write(data)
received_size += len(data)
else:
print("file [%s] has uploaded..." % filename) def handle(self):
while True:
try:
self.data = self.request.recv(1024).strip()
print("{} wrote:".format(self.client_address[0]))
print(self.data)
cmd_dic = json.loads(self.data.decode())
action = cmd_dic["action"]
if hasattr(self,action):
func = getattr(self,action)
func(cmd_dic) except ConnectionResetError as e:
print("err",e)
break
if __name__ == "__main__":
HOST, PORT = "localhost", 9999
# Create the server, binding to localhost on port 9999
server = socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler)
server.serve_forever()
'''客户端'''
1 _author__ = "Dbass"
import socket
import json
import os
#client.connect(('192.168.16.200',9999))
class FtpClient(object):
def __init__(self):
self.client = socket.socket()
def help(self):
msg = '''
ls
pwd
cd ../..
get filename
put filename
'''
print(msg)
def connect(self,ip,port):
self.client.connect((ip, port))
def interactive(self):
#self.authenticate()
while True:
cmd = input(">>").strip()
if len(cmd) ==0:continue
cmd_str = cmd.split()[0]
if hasattr(self,"cmd_%s" % cmd_str):
func = getattr(self,"cmd_%s" % cmd_str)
func(cmd)
else:
self.help()
def cmd_put(self,*args):
cmd_split = args[0].split()
if len(cmd_split) >1:
filename = cmd_split[1]
if os.path.isfile(filename):
filesize = os.stat(filename).st_size
msg_dic = {
"action": "put",
"filename":filename,
"size": filesize,
"overridden":True
}
self.client.send( json.dumps(msg_dic).encode("utf-8") )
print("send", json.dumps(msg_dic).encode("utf-8"))
# 防止粘包,等服务器确认
server_response = self.client.recv(1024)
f = open(filename,"rb")
for line in f:
self.client.send(line)
else:
print("file upload success...")
f.close()
else:
print(filename,"is not exist")
def cmd_get(self,*args):
'''get IMG_6245.jpg'''
cmd_split=args[0].split()
if len(cmd_split) >1:
filename=cmd_split[1]
if os.path.isfile(filename):
print("filename has lived")
else:
msg_dic = {
"action": "get",
"filename": filename,
"overridden": True
}
self.client.send(json.dumps(msg_dic).encode("utf-8"))
print("send", json.dumps(msg_dic).encode("utf-8"))
server_response = self.client.recv(1024)# 防止粘包,等服务器确认
print(server_response)
filesize = int(self.client.recv(1024).decode())
print(filesize)
server_response2 = self.client.recv(1024)# 防止粘包,等服务器确认
print(server_response2)
received_size = 0
f = open(filename, "wb")
while received_size < filesize:
data = self.client.recv(1024)
f.write(data)
received_size += len(data)
else:
print("file [%s] has uploaded..." % filename) ftp = FtpClient()
ftp.connect("localhost",9999)
ftp.interactive()
socket实现FTP上传下载功能的更多相关文章
- Java实现FTP上传下载功能
Java FTP客户端工具包很多,在此我选用的Apache的FTPClient.这个包的获取可以通过http://commons.apache.org/net/来获取,我使用的是最新的commons- ...
- socket实现ftp上传下载
socket实现ftp文件的上传和下载 server端代码: import socket import json import struct import os soc = socket.socket ...
- ftp上传下载功能实现
该程序分为客户端和服务端,目前已经实现以下功能: 1. 多用户同时登陆 2. 用户登陆,加密认证 3. 上传/下载文件,保证文件一致性 4. 传输过程中现实进度条 5. 不同用户家目录不同,且只能访问 ...
- JAVA 实现FTP上传下载(sun.net.ftp.FtpClient)
package com.why.ftp; import java.io.DataInputStream; import java.io.File; import java.io.FileInputSt ...
- FTP上传下载工具(FlashFXP) v5.5.0 中文版
软件名称: FTP上传下载工具(FlashFXP) 软件语言: 简体中文 授权方式: 免费试用 运行环境: Win 32位/64位 软件大小: 7.4MB 图片预览: 软件简介: FlashFXP 是 ...
- 高可用的Spring FTP上传下载工具类(已解决上传过程常见问题)
前言 最近在项目中需要和ftp服务器进行交互,在网上找了一下关于ftp上传下载的工具类,大致有两种. 第一种是单例模式的类. 第二种是另外定义一个Service,直接通过Service来实现ftp的上 ...
- python之实现ftp上传下载代码(含错误处理)
# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之实现ftp上传下载代码(含错误处理) #http://www.cnblogs.com/kait ...
- FTP上传下载文件(函数简易版)
FTP上传下载文件(函数简易版) # 服务端 import socket import json import hashlib import struct import os user_dic = { ...
- windows系统下ftp上传下载和一些常用命令
先假设一个ftp地址 用户名 密码 FTP Server: home4u.at.china.com User: yepanghuang Password: abc123 打开windows的开始菜单, ...
随机推荐
- ssh连接远程主机执行脚本的环境变量问题
近日在使用ssh命令ssh user@remote ~/myscript.sh登陆到远程机器remote上执行脚本时,遇到一个奇怪的问题: ~/myscript.sh: line n: app: co ...
- 2019-04(2)Python学习
一.元组 1.什么是元组? 元组是一个固定长度,不可改变的Python序列对象.创建元组的最简单方式,是用逗号分隔一列值: In [1]: tup = 4, 5, 6 In [2]: tup Out[ ...
- 这是一个新的开始at this very monment
简单的介绍下此时自己的情况,和对近几年所做的事做一个总结,并展望下自己的未来和对自己的期待.我会将我的博客分成两种,一个是我的学习笔记,另一个是我的生活记录. 2018年六月底我毕业于一个普通的二本, ...
- input下拉框
用Html5和css.js写的,引用的bootstrap和jquery文件请各位看客自己去下载
- Vue的从入门到放弃
此贴仅记录vue学习路程中遇见的大大小小,形形色色的问题 1. vue自动打开浏览器配置: 当使用vue 脚手架搭建项目后启动npm run dev,会出现 但是不会自动打开浏览器的,这时候去con ...
- 关于项目里server清楚缓存的代码
Venk proc存在很多问题,不能应对高并发的情况,所以提供了这个 方法来清理cache, 但是前提是需要有prod的权限: 要想验证是否通过URL清楚了缓存,就要 removeCache url执 ...
- linux jdk 环境变量
一.jdk的安装 1.下载 jdk-7u79-linux-i586.tar.gz 2.tar -zxvf jdk-7u79-linux-i586.tar.gz 解压 3.mv jdk1.7.0_79 ...
- 关于签名sign的坑
在有些支付文档或其他文档都会要求签名验证 /** * description:签名 * function name:sign * @param $data * @return string */fun ...
- sqlserver 并行度
转载地址:http://www.cnblogs.com/zhijianliutang/p/4148540.html
- DecimalFormat 的用法
DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字. DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字.Dec ...