服务端:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# import socketserver
# bufsize = 1024
# host = '127.0.0.1'
# port = 8100
# address = (host,port)
#
# class MYtcphandler(socketserver.BaseRequestHandler):
# def handle(self):
# while True:
# data=self.request.recv(bufsize)
# if not data:break
# self.request.sendall(data.upper())
# if __name__ == '__main__':
# sever=socketserver.ThreadingTCPServer((address),MYtcphandler)
# sever.serve_forever()
import socketserver,os,socket
class MYtcphandler(socketserver.BaseRequestHandler):
def handle(self):
while True:
client_data=self.request.recv(bufsize).strip()
if not client_data: break
client_data=client_data.split('|')
if hasattr(self,client_data[0]):
func=getattr(self,client_data[0])
func(client_data)
def filetrans(self,msg):
print('filetrans',msg)
if msg[1] == 'get':
print('client wants to download file',msg[2])
if os.path.isfile(msg[2]):
file_size=os.path.getsize(msg[2])
res="ready|%s" %file_size
else:
res="file not exit"
sen_conirmation="filetrans|get|%s" %res
self.request.send(sen_conirmation)
feedback=self.request.recv(100)
if feedback == 'filetrans|get|recv_ready':
f=open(msg[2],'rb')
send_size=0
while not file_size==file_size:
if file_size-send_size > 1024:
data=f.read(1024)
send_size+=1024
else:
data=f.read(file_size-send_size)
send_size+=(file_size-send_size)
self.request.send(data)
print(file_size,send_size)
else:
print('##############send file:%s done'%msg[2])
elif msg[1] == 'put':
print('client wants to download file',msg[2])
#sendmessage
feedback = self.request.recv(100)
if feedback == 'filetrans|put|recv_ready':
file_size = int(feedback.split()[-1])
self.request.send("recv_ready")
recv_size = 0
put_file_name = msg[2]
f = open(os.path.basename(put_file_name), 'wb')
print('#########',put_file_name)
while not file_size == recv_size:
if file_size - recv_size > bufsize:
data = self.request.recv(bufsize)
recv_size += len(data)
else:
data = self.request.recv(file_size - recv_size)
recv_size += (file_size - recv_size)
# 接收就写入
f.write(data)
print(file_size,recv_size)
print('put %sdone',put_file_name)
# put_file_name=msg[2]
# if os.path.isfile(msg[2]):
# print('pass')
# put_size = os.path.getsize(msg[2])
# put_conirmation = "filetrans|put|%s" % put_size
# else:
# print('faile')
#put_size=os.path.getsize(msg[2])
#put_conirmation="filetrans|put|%s" %put_size
if __name__ == '__main__':
bufsize = 1024
host = '127.0.0.1'
port = 8090
address = (host,port)
server=socketserver.ThreadingTCPServer((address),MYtcphandler)
server.serve_forever()
客户端:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socketserver,os,socket
class ftpclient(object):
def __init__(self,address):
self.sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
self.sock.connect((address))
def start(self):
self.useractive()
def useractive(self):
while True:
user_input=input('>>:').strip()
if len(user_input)==0:continue
user_input=user_input.split()
if hasattr(self,user_input[0]):
func=getattr(self,user_input[0])
func(user_input)
else:
print('wrong cmd usage')
def get(self,msg):
print('##get func###',msg)
if len(msg)==2:
file_name=msg[1]
client_data='filetrans|get|%s' % file_name
self.sock.send(client_data)
feedback=self.sock.recv(100)
print('server confirm msg',feedback)
if feedback.startswith('filetrans|get|ready'):
file_size=int(feedback.split('|')[-1])
self.sock.send('filetrans|get|recv_ready')
recv_size=0
f=open('client_recv/%s' %os.path.basename(file_name),'wb')
print('new file_name',file_name)
while not file_size==recv_size:
if file_size-recv_size>bufsize:
data=self.sock.recv(bufsize)
recv_size+=len(data)
else:
data=self.sock.recv(file_size-recv_size)
recv_size+=(file_size-recv_size)
f.write(data)
print(file_size,recv_size)
else:
print('###########recv file:%s#################'%file_name)
f.close()
print(feedback)
else:
print('wrong cmd usage')
def put(self,msg):
print('##put func###', msg)
if len(msg) == 2:
file_name = msg[1]
client_data = 'filetrans|put|%s' %file_name
self.sock.send(client_data.encode('utf-8'))
feedback = self.sock.recv(100)
if os.path.isfile(file_name):
print('pass')
file_size=os.path.getsize(file_name)
res = "ready %s" %file_size
print('########',res)
self.sock.send(res)
if feedback == 'recv_ready':
f=open(file_name,'wb')
send_size = 0
while not file_size == send_size:
if file_size - send_size > 1024:
data = f.read(1024)
send_size += 1024
else:
data = f.read(file_size - send_size)
send_size += (file_size - send_size)
print(file_size,send_size)
self.sock.send(data)
else:
print('##########send file:%s done############' %file_name)
f.close()
else:
print('faile')
res="file doesn's exist"
print('##########',res)
self.sock.send(res)
def ls(self):
pass
def cd(self):
pass
def delete(self):
pass
if __name__ == '__main__':
bufsize = 1024
host = '127.0.0.1'
port = 8090
address = (host,port)
p=ftpclient(address)
p.start()