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太多,明天再说!
睡觉!
发表评论