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 ...
随机推荐
- poj 2299 Ultra-QuickSort(树状数组求逆序数)
链接:http://poj.org/problem?id=2299 题意:给出n个数,求将这n个数从小到大排序,求使用快排的需要交换的次数. 分析:由快排的性质很容易发现,只需要求每个数的逆序数累加起 ...
- mybaits入门(含实例教程和源码) http://blog.csdn.net/u013142781/article/details/50388204
前言:mybatis是一个非常优秀的存储过程和高级映射的优秀持久层框架.大大简化了,数据库操作中的常用操作.下面将介绍mybatis的一些概念和在eclipse上的实际项目搭建使用. 一.mybati ...
- 【Python】使用python操作mysql数据库
这是我之前使用mysql时用到的一些库及开发的工具,这里记录下,也方便我查阅. python版本: 2.7.13 mysql版本: 5.5.36 几个python库 1.mysql-connector ...
- sql中的duplicate的使用
应用场景:有时候在做一些系统设置功能的时候,系统在第一次使用,或者初始化的时候,该设置信息并没有存在于数据库中,或者该系统设置信息永远只保存一条,没有必要为增加和修改这条信息而分别编写insert和u ...
- matlab中 assert(any(mask(:)));
首先,matlab中any函数:检测矩阵mask中是否有非零元素,如果有,返回1,:如果没有非零元素,即所有元素都是0,那么则返回0. assert()是一个调试程序时经常使用的宏,在程序运行时它计算 ...
- java 重写你可以这么理解 因为 方法名和参数类型个数相同 所以这就是重写了 然后 因为是重写 所以 返回值必须相同
java 重写你可以这么理解 因为 方法名和参数类型个数相同 所以这就是重写了 然后 因为是重写 所以 返回值必须相同
- 通过域名访问部署在服务器上的javaweb项目
因为对域名访问什么也不了解,遇到问题就有种不知道从哪里下手的茫然,也就更不知道错在哪里,前前后后一共折腾了一天多,最后问了阿里客服才成功弄出来,因此记录一下. 关于服务器的购买.配置,及域名的备案解析 ...
- JAVA ACM 基础
java ACM Java做ACM-ICPC的特点: (1) 在一般比赛中,Java程序会有额外的时间和空间,而实际上经过实验,在执行计算密集任务的时候Java并不比C/C++慢多少,只是IO操作较慢 ...
- mysql内外连接
更新于2017-12-13,在今天的一个面试里面被问到了left/right outer join,回答上来了.但又问了一下inner join ,一下子记不清inner jion是个什么东西了.这次 ...
- ibatis解决sql注入问题
原文: http://blog.csdn.net/scorpio3k/article/details/7610973 对于ibaits参数引用可以使用#和$两种写法,其中#写法会采用预编译方式,将转义 ...