服务器端是类似于百度云的东西,他上边会有文件,客户端连接服务器端后,可以选择在里面下载,或是上传文件。
服务器端:
from socket import *
from threading import Thread
import time
import os
HOST = "192.168.1.201"
PORT = 8888
ADDR = (HOST,PORT)
FTP = "/root/FTP/"
fileaddr = None
class FtpServer:
def __init__(self,connfd,fileaddr):
self.connfd = connfd
self.fileaddr = fileaddr
def do_list(self):
file_list = os.listdir(self.fileaddr)
if not file_list:
self.connfd.send("该文件夹没东西".encode())
return
else:
self.connfd.send(b"OK")
time.sleep(0.1)
fs = ''
for file in file_list:
if file[0] != "." and os.path.isfile(self.fileaddr+file):
fs += file + '\n'
print(fs)
self.connfd.send(fs.encode())
def do_get(self,filename):
if not os.path.exists(self.fileaddr+filename):
self.connfd.send("欧,亲爱的,没有这个软件呢".encode())
return
else:
self.connfd.send("OK".encode())
time.sleep(0.1)
file = open(self.fileaddr+filename,"rb")
while True:
data = file.read(1024)
if not data:
break
self.connfd.send(data)
file.close()
time.sleep(0.1)
self.connfd.send(b"##")
def do_put(self, filename):
file = open(self.fileaddr+filename,"wb")
while True:
data = self.connfd.recv(1024)
if data == b"##":
break
file.write(data)
file.close()
print("----")
def handle(c):
cls = c.recv(1024)
fileaddr = FTP + cls.decode()+"/"
ftp = FtpServer(c,fileaddr)
while True:
data = c.recv(1024).decode()
if data[0] == "Q" or not data:
return
elif data[0] == "L":
ftp.do_list()
elif data[0] == "G":
filename = data.strip().split(" ")[-1]
ftp.do_get(filename)
elif data[0] =="P":
filename = data.strip().split(" ")[-1]
ftp.do_put(filename)
# da jian wang luo ping tai
def main():
socked = socket()
socked.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
socked.bind(ADDR)
socked.listen(10)
while True:
try:
c,addr = socked.accept()
except KeyboardInterrupt:
print("error")
return
except Exception as result:
print(result)
continue
print("who is connect:",addr)
p = Thread(target=handle,args=(c,))
p.setDaemon(True)
p.start()
if __name__ == '__main__':
main()
```python
服务器端:
from socket import *
import os
import time
import sys
HOST = "192.168.1.201"
PORT = 8888
ADDR = (HOST,PORT)
socked = socket()
class FtpClient:
def __init__(self,socked):
self.socked = socked
def do_list(self):
self.socked.send(b'L')
data = self.socked.recv(128).decode()
if data == "OK":
conntent = self.socked.recv(1024).decode()
print(conntent)
else:
print(data)
def do_quit(self):
self.socked.send(b'Q')
socked.close()
sys.exit("退出程序")
def do_get(self,filename):
self.socked.send(('G '+filename).encode())
data = self.socked.recv(1024).decode()
if data =='OK':
file = open(filename,"wb")
print("ok")
while True:
data = self.socked.recv(1024)
if data == b"##":
break
file.write(data)
file.close()
print("----")
else:
print(data)
def do_put(self,filename):
if not os.path.exists(filename):
print("欧,亲爱的,没有这个文件呢")
return
else:
self.socked.send(('P ' + filename).encode())
time.sleep(0.1)
file = open(filename,"rb")
while True:
data = file.read(1024)
if not data:
break
self.socked.send(data)
file.close()
time.sleep(0.1)
self.socked.send(b"##")
def request(socked):
ftp = FtpClient(socked)
while True:
print("========\n"
"list\n"
"get File\n"
"put File\n"
"quit")
cmd= input("请输入你想进行的模式")
if cmd == "list":
ftp.do_list()
elif cmd =="quit":
ftp.do_quit()
elif cmd.strip()[:3] =="get":
print("进入do_get")
filename = cmd.strip().split(" ")[-1]
ftp.do_get(filename)
elif cmd.strip()[:3] == "put":
print("进入do_put")
filename = cmd.strip().split(" ")[-1]
ftp.do_put(filename)
def main():
try:
socked.connect(ADDR)
except Exception as result:
print(result)
print("连接失败")
return
else:
print("==========\n"
"Data\n"
"File\n"
"Image")
cls = input("请输入你想去的文件夹:")
if cls not in ["Data","File","Image"]:
print("你输入错误")
return
else:
socked.send(cls.encode())
request(socked)
if __name__ == '__main__':
main()