1 # 编辑者:闫龙

2 import socket,json,struct

3 class MySocket:

4 with open("FtpServiceConfig","r",encoding="utf8") as f:

5 Config = json.loads(f.read())

6 AFType= eval("socket."+Config["AFType"])

7 KIND=eval("socket."+Config["KIND"])

8 IPaddress= Config["IPaddress"]

9 Port=Config["Port"]

10 MaxLinks=Config["MaxLinks"]

11 def __init__(self):

12 self.SockObj = socket.socket(self.AFType,self.KIND)

13 self.SockObj.bind((self.IPaddress,self.Port))

14 self.SockObj.listen(self.MaxLinks)

15 def Starting(self):

16 self.Clients,self.IpInfo=self.SockObj.accept()

17 def GetHeadLen(self):

18 return struct.unpack("i",self.Clients.recv(4))[0]

19 def GetHead(self,Len:int):

20 return json.loads(self.Clients.recv(Len).decode("utf8"))

21 def GetDatas(self,Len:int):

22 return self.Clients.recv(Len)

23 def SendDatas(self,SendWhat):

24 self.Clients.send(SendWhat.encode("utf8"))

25 def ClientBye(self):

26 self.Clients.close()

27 def ByeBye(self):

28 self.SockObj.close()

FTP服务器类

1 # 编辑者:闫龙

2 import socket,json,struct

3 class MyClient:

4 with open("FtpClientConfig","r",encoding="utf8") as f:

5 Config = json.loads(f.read())

6 AFType = eval("socket."+Config["AFType"])

7 KIND = eval("socket."+Config["KIND"])

8 IPaddress = Config["IPaddress"]

9 Port = Config["Port"]

10 def __init__(self):

11 self.SockObj = socket.socket(self.AFType,self.KIND)

12 def ConnetService(self):

13 self.SockObj.connect((self.IPaddress, self.Port))

14 def GetInfo(self,Len:int):

15 return self.SockObj.recv(Len)

16 def SendInfo(self,SendWhat):

17 self.SockObj.send(SendWhat)

18 def SendHeadLen(self,HeadLen):

19 HeadLen = json.dumps(HeadLen).encode("utf8")

20 self.SockObj.send(struct.pack("i",len(HeadLen)))

21 def SendHead(self,Head):

22 self.SockObj.send(json.dumps(Head).encode("utf8"))

FTP客户端类

1 # 编辑者:闫龙

2 import FtpServerClass as fsc

3 import time

4 FtpService = fsc.MySocket()

5 FtpService.Starting()

6 while True:

7 try:

8 HeadLen = FtpService.GetHeadLen()

9 Head = FtpService.GetHead(HeadLen)

10 f = open(Head["FileName"],"wb")

11 RecvSize = 0

12 RecvData = b""

13 i = 1

14 while RecvSize < Head["DataSize"]:

15 getdata = FtpService.GetDatas(1024)

16 RecvData += getdata

17 RecvSize = len(RecvData)

18 f.write(getdata)

19 print("%s/%s"%(RecvSize,Head["DataSize"]))

20 time.sleep(0.0005)

21 except Exception as e:

22 print(e)

23 break

FTP服务器端

1 # 编辑者:闫龙

2 import FtpClientClass as fcc

3 import os

4 FtpClient = fcc.MyClient()

5 FtpClient.ConnetService()

6 while True:

7 choice = input(">>>:")

8 if not choice : continue

9 FileSize = os.path.getsize(choice)

10 ClientHead = {"DataSize":FileSize,"FileName":os.path.basename(choice)}

11 FtpClient.SendHeadLen(ClientHead)

12 FtpClient.SendHead(ClientHead)

13 SendSize = 0

14 with open(choice,"rb") as f:

15 for i in f:

16 FtpClient.SendInfo(i)

17 SendSize += len(i)

18 print(SendSize)

19 print("上传完成")

FTP客户端

1 {"AFType":"AF_INET","KIND":"SOCK_STREAM","IPaddress":"127.0.0.1","Port":9527,"MaxLinks":5}

服务器配置文件

1 {"AFType":"AF_INET","KIND":"SOCK_STREAM","IPaddress":"127.0.0.1","Port":9527}

客户端配置文件

熬到现在头脑已经不清醒了,基本实现上传功能,未完待续

BUG太多,明天再说!

睡觉!

查看原文