Python练习-基于socket的FTPServer
# 编辑者:闫龙
import socket,json,struct
class MySocket:
with open("FtpServiceConfig","r",encoding="utf8") as f:
Config = json.loads(f.read())
AFType= eval("socket."+Config["AFType"])
KIND=eval("socket."+Config["KIND"])
IPaddress= Config["IPaddress"]
Port=Config["Port"]
MaxLinks=Config["MaxLinks"]
def __init__(self):
self.SockObj = socket.socket(self.AFType,self.KIND)
self.SockObj.bind((self.IPaddress,self.Port))
self.SockObj.listen(self.MaxLinks)
def Starting(self):
self.Clients,self.IpInfo=self.SockObj.accept()
def GetHeadLen(self):
return struct.unpack("i",self.Clients.recv(4))[0]
def GetHead(self,Len:int):
return json.loads(self.Clients.recv(Len).decode("utf8"))
def GetDatas(self,Len:int):
return self.Clients.recv(Len)
def SendDatas(self,SendWhat):
self.Clients.send(SendWhat.encode("utf8"))
def ClientBye(self):
self.Clients.close()
def ByeBye(self):
self.SockObj.close()
FTP服务器类
# 编辑者:闫龙
import socket,json,struct
class MyClient:
with open("FtpClientConfig","r",encoding="utf8") as f:
Config = json.loads(f.read())
AFType = eval("socket."+Config["AFType"])
KIND = eval("socket."+Config["KIND"])
IPaddress = Config["IPaddress"]
Port = Config["Port"]
def __init__(self):
self.SockObj = socket.socket(self.AFType,self.KIND)
def ConnetService(self):
self.SockObj.connect((self.IPaddress, self.Port))
def GetInfo(self,Len:int):
return self.SockObj.recv(Len)
def SendInfo(self,SendWhat):
self.SockObj.send(SendWhat)
def SendHeadLen(self,HeadLen):
HeadLen = json.dumps(HeadLen).encode("utf8")
self.SockObj.send(struct.pack("i",len(HeadLen)))
def SendHead(self,Head):
self.SockObj.send(json.dumps(Head).encode("utf8"))
FTP客户端类
# 编辑者:闫龙
import FtpServerClass as fsc
import time
FtpService = fsc.MySocket()
FtpService.Starting()
while True:
try:
HeadLen = FtpService.GetHeadLen()
Head = FtpService.GetHead(HeadLen)
f = open(Head["FileName"],"wb")
RecvSize = 0
RecvData = b""
i = 1
while RecvSize < Head["DataSize"]:
getdata = FtpService.GetDatas(1024)
RecvData += getdata
RecvSize = len(RecvData)
f.write(getdata)
print("%s/%s"%(RecvSize,Head["DataSize"]))
time.sleep(0.0005)
except Exception as e:
print(e)
break
FTP服务器端
# 编辑者:闫龙
import FtpClientClass as fcc
import os
FtpClient = fcc.MyClient()
FtpClient.ConnetService()
while True:
choice = input(">>>:")
if not choice : continue
FileSize = os.path.getsize(choice)
ClientHead = {"DataSize":FileSize,"FileName":os.path.basename(choice)}
FtpClient.SendHeadLen(ClientHead)
FtpClient.SendHead(ClientHead)
SendSize = 0
with open(choice,"rb") as f:
for i in f:
FtpClient.SendInfo(i)
SendSize += len(i)
print(SendSize)
print("上传完成")
FTP客户端
{"AFType":"AF_INET","KIND":"SOCK_STREAM","IPaddress":"127.0.0.1","Port":9527,"MaxLinks":5}
服务器配置文件
{"AFType":"AF_INET","KIND":"SOCK_STREAM","IPaddress":"127.0.0.1","Port":9527}
客户端配置文件
熬到现在头脑已经不清醒了,基本实现上传功能,未完待续
BUG太多,明天再说!
睡觉!
Python练习-基于socket的FTPServer的更多相关文章
- Python编写基于socket的非阻塞多人聊天室程序(单线程&多线程)
前置知识:socket非阻塞函数(socket.setblocking(False)),简单多线程编程 代码示例: 1. 单线程非阻塞版本: 服务端: #!/usr/bin/env python # ...
- Python之基于socket和select模块实现IO多路复用
'''IO指的是输入输出,一部分指的是文件操作,还有一部分网络传输操作,例如soekct就是其中之一:多路复用指的是利用一种机制,同时使用多个IO,例如同时监听多个文件句柄(socket对象一旦传送或 ...
- Python基于socket模块实现UDP通信功能示例
Python基于socket模块实现UDP通信功能示例 本文实例讲述了Python基于socket模块实现UDP通信功能.分享给大家供大家参考,具体如下: 一 代码 1.接收端 import ...
- 十三python基础之socket编程
阅读目录 一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 八 基于UDP的套接字 九 粘包现 ...
- python基础之socket编程
一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 八 基于UDP的套接字 九 粘包现象 十 什么是 ...
- python基础之socket编程 (转自林海峰老师)
python基础之socket编程 阅读目录 一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 ...
- Python 网络编程——socket
一 客户端/服务器架构 客户端(Client)服务器(Server)架构,即C/S架构,包括 1.硬件C/S架构(打印机) 2.软件C/S架构(web服务) 理想/目标状态—— 最常用的软件服务器是 ...
- python网络编程-socket编程
一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层 ...
- Python之路【第七篇】python基础 之socket网络编程
本篇文章大部分借鉴 http://www.cnblogs.com/nulige/p/6235531.html python socket 网络编程 一.服务端和客户端 BS架构 (腾讯通软件:ser ...
随机推荐
- 微信小程序组件 自定义弹出框
<!-- 点击立即抢拼弹出框 --> <view class='add-rob' bindtap="setModalStatus" data-status=&qu ...
- Centos7 pip 安装MySQLdb(mysql-python)出错
租了个阿里云的Centos7的ECS,需要使用pip安装MySQLdb模块.也就是mysql-python模块. 但是遇到问题 Collecting mysql-python Downloading ...
- JavaWeb基础【1】—— Tomcat
此笔记是学习黑马程序员JavaWeb系列视频的课堂笔记. 感谢黑马程序员. 一.Tomcat概述 Tomcat服务器由Apache提供,开源免费.由于Sun和其他公司参与到了Tomcat的开发中,所以 ...
- Latex编译过程中遇到的奇奇怪怪的问题及解决方案
标签(空格分隔): 杂七杂八的问题 有必要写一个博文记录自己在Latex编译时遇到的各种问题,希望可以帮到遇到同样错误的亲故.讲真,一直没有系统的学习Latex,都是投哪个会直接拿那个会的模板来套,然 ...
- oracle exp导出加上过滤条件
exp username/password@dbname file='d:\hehe.dmp' tables=(%) query="""where UPDATE_DT ...
- 一次绕过防火墙获取RCE以及提权到root权限的渗透过程
本文是关于Apache struts2 CVE-2013-2251是由于导致执行远程命令的影响而被高度利用的漏洞.简而言之, 通过操纵以“action:”/”redirect:”/”redirectA ...
- 模拟器下的虚拟sd卡添加文件
1.若出现mkdir failed for myData Read-only file system,在执行 adb shell 命令后,执行mount -o remount ,rw / (去除文件的 ...
- (转)Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (三) —— SharePreferences
除了SQLite数据库外,SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息.其存储位置在/data ...
- D. Monitor Educational Codeforces Round 28
http://codeforces.com/contest/846/problem/D 二分答案 适合于: 判断在t时候第一次成立 哪个状态是最小代价 #include <cstdio> ...
- C#线程篇---让你知道什么是线程(1)
线程线程,进程进程,到底什么是线程,什么是熟练多线程编程? 今天来和大家一起讨论讨论线程基础,让大家知道线程的基本构造. 说线程之前,先要了解下进程,这个可不能不知道. 什么是进程? Microsof ...