# 编辑者:闫龙
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的更多相关文章

  1. Python编写基于socket的非阻塞多人聊天室程序(单线程&多线程)

    前置知识:socket非阻塞函数(socket.setblocking(False)),简单多线程编程 代码示例: 1. 单线程非阻塞版本: 服务端: #!/usr/bin/env python # ...

  2. Python之基于socket和select模块实现IO多路复用

    '''IO指的是输入输出,一部分指的是文件操作,还有一部分网络传输操作,例如soekct就是其中之一:多路复用指的是利用一种机制,同时使用多个IO,例如同时监听多个文件句柄(socket对象一旦传送或 ...

  3. Python基于socket模块实现UDP通信功能示例

    Python基于socket模块实现UDP通信功能示例 本文实例讲述了Python基于socket模块实现UDP通信功能.分享给大家供大家参考,具体如下: 一 代码 1.接收端     import ...

  4. 十三python基础之socket编程

      阅读目录 一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 八 基于UDP的套接字 九 粘包现 ...

  5. python基础之socket编程

    一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 八 基于UDP的套接字 九 粘包现象 十 什么是 ...

  6. python基础之socket编程 (转自林海峰老师)

    python基础之socket编程   阅读目录 一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 ...

  7. Python 网络编程——socket

    一 客户端/服务器架构 客户端(Client)服务器(Server)架构,即C/S架构,包括 1.硬件C/S架构(打印机) 2.软件C/S架构(web服务) 理想/目标状态—— 最常用的软件服务器是 ...

  8. python网络编程-socket编程

     一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层 ...

  9. Python之路【第七篇】python基础 之socket网络编程

    本篇文章大部分借鉴 http://www.cnblogs.com/nulige/p/6235531.html python socket  网络编程 一.服务端和客户端 BS架构 (腾讯通软件:ser ...

随机推荐

  1. dotnet core sdk 2.1 在centos下的安装

    1. 安装微软的仓库 rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm 2. 修改仓库 ...

  2. [转帖] IIS 与 HTTP/2 的介绍.

    HTTP/2 on IIS https://blogs.iis.net/davidso/http2 Friday, September 11, 2015 Windows 10 HTTP2 In Oct ...

  3. 能把opencv的源码也进行调试吗?(需要pdb文件才行)

    能把opencv的源码也进行调试吗?(需要pdb文件才行)1.我是用的Qt Creator,然后"工具\选项\调试器\概要\源码路径映射"中,选择"添加Qt源码" ...

  4. Java并发知识点总结

    前言:Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎.同时,如果想要提升自己的技术,Java并发知识必不可少,这里简单整理了一些相关内容,希望可以起到抛砖引玉的作用 ...

  5. python读取写入内存方法SringIO,BytesIO

    python中不仅仅可以在磁盘中写入文件,还允许直接在内存中直接写入数据:需要借助StringIO和BytesIO来实现: 1.直接操作StringIO from io import StringIO ...

  6. [LOJ2271] [SDOI2017] 遗忘的集合

    题目链接 LOJ:https://loj.ac/problem/2271 洛谷:https://www.luogu.org/problemnew/show/P3784 BZOJ太伤身体死活卡不过还是算 ...

  7. [UVALive 3902] Network

    图片加载可能有点慢,请跳过题面先看题解,谢谢 一道简单的贪心题,而且根节点已经给你了(\(S\)),这就很好做了. 显然,深度小于等于 \(k\) 的都不用管了(\(S\) 深度为0),那么我们只需要 ...

  8. BZOJ3155:Preprefix sum——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3155 最朴素的想法是两棵树状数组,一个记录前缀和,一个记录前缀前缀和,但是第二个我们非常不好修改 ...

  9. CentOS7搭建elasticsearch集群

    准备三个节点,系统版本为CentOS7.3. 11.0.10.18 es01 11.0.10.19 es02 11.0.10.20 es03 1.安装java环境 # yum install -y j ...

  10. 响应式开发(三)-----Bootstrap框架的安装使用

    下载 Bootstrap 可以从http://getbootstrap.com/上下载 Bootstrap 的最新版本. Download Bootstrap:下载 Bootstrap.点击该按钮,您 ...