客户端
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
__author__ = 'gaogd'
import socket
class FTP(object):
def __init__(self,host,port):
self.host = host
self.port = port
def put(self,msg): ###上传文件到服务端
print 'going to send file:%s to client' % msg[0]
filename = msg[0]
if os.path.isfile(filename):
file_size = os.path.getsize(filename)
ack_msg = "file_transter|put|%s" % (filename)
print "ack_msg >>>>>>",ack_msg
self.sock.send(ack_msg)
client_file = self.sock.recv(1024)
if client_file.startswith("file_transfer|put|recv|%s" %filename):
ack_msg_size = "file_transfer|put|recv|%s|%s" %(filename,file_size)
self.sock.send(ack_msg_size)
print "ack_msg_size>>>",ack_msg_size
else:
print 'server not ready recv'
return False
# print '---->client_acl: ', client_ack
client_ack = self.sock.recv(1024)
if client_ack.startswith("file_transfer|put|recv|ready"): ## 如果服务器通过这个,那就是说明服务端已经做好接收的准备了
f = file(filename, 'rb')
for line in f:
self.sock.send(line) ##发文件
else:
print '--file %s send done' % filename
f.close()
else:
ack_msg = "file_transfer|get|file doesn't exist"
self.sock.send(ack_msg)
def get(self,msg): ##从服务端中下载内容
print 'get:: ',msg
if len(msg) > 0: ##判断 get 后面是否接文件名
remote_filename = msg[0]
cmd_msg="file_transter|get|%s" % remote_filename
self.sock.send(cmd_msg)
#print cmd_msg
feedback = self.sock.recv(1024)
print '---feedback',feedback
if feedback.startswith("file_transter1|get|ready"):
file_size = int(feedback.split('|')[-1])
ack_msg = "file_transfer|get|recv|ready"
self.sock.send(ack_msg)
f = file('recv/%s' % remote_filename,'wb')
recv_size = 0
while not file_size == recv_size:
if file_size - recv_size > 1024:
data = self.sock.recv(1024)
f.write(data)
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:
f.close()
print feedback
else:
print 'test'
def list_file(self):
pass
def interactive(self):
while True:
user_input = raw_input('ftp_client::').strip()
if len(user_input) == 0:
continue
cmd = user_input.split()
if hasattr(self,cmd[0]):
func = getattr(self,cmd[0]) ## put |get |list_file
func(cmd[1:])
else:
print "\033[31;1m Wrong cmd usage !\033[0m"
def connect(self):
self.sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
self.sock.connect((self.host,self.port ))
self.interactive()
if __name__ == '__main__':
ftp = FTP('127.0.0.1',50018)
ftp.connect()
服务端
#!/usr/bin/python
# -*- coding: utf-8 -*-
__author__ = 'gaogd'
import os
import SocketServer
class MyTCPHandler(SocketServer.BaseRequestHandler):
"""
The RequestHandler class for our server.
It is instantiated once per connection to the server,
and must override the handle() method to implement communication
to the client.
"""
def handle(self):
while True:
data = self.request.recv(1024).strip()
data = data.split("|")
print data
if hasattr(self,data[0]):
func = getattr(self,data[0])
func(data[1:])
def file_transter(self,msg):
# print msg[0]
if msg[0] == 'get':
print 'going to send file:%s to client' % msg[1]
filename = msg[1]
if os.path.isfile(filename):
file_size = os.path.getsize(filename)
ack_msg = "file_transter1|get|ready|%s" % file_size
self.request.send(ack_msg)
client_ack = self.request.recv(1024)
#print '---->client_acl: ', client_ack
if client_ack.startswith("file_transfer|get|recv|ready"):
f = file(filename,'rb')
for line in f:
self.request.send(line)
else:
print '--file %s send done'% filename
f.close()
else:
ack_msg= "file_transfer|get|file doesn't exist"
self.request.send(ack_msg)
##############################################################################
if msg[0] == 'put': ##接收客户端上传过来的文件
print 'put:: ', msg[1]
if len(msg[1]) > 0 : ###判断 get 后面是否接文件名,如果不存在,那就是命令有问题
remote_filename = msg[1]
cmd_msg = "file_transfer|put|recv|%s" % remote_filename
print 'cmd_msg>>>>',cmd_msg
self.request.send(cmd_msg) ## 告诉客户端已经准备好接收了
feedback = self.request.recv(1024)
print '---feedback', feedback
if feedback.startswith("file_transfer|put|recv"):
file_size = int(feedback.split('|')[-1])
ack_msg = "file_transfer|put|recv|ready"
self.request.send(ack_msg) ## 告诉客户端已经做好准备接收了
f = file('recv/%s' % remote_filename, 'wb')
recv_size = 0
while not file_size == recv_size:
if file_size - recv_size > 1024:
data = self.request.recv(1024)
f.write(data)
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
else:
f.close()
print feedback
else:
print 'put filename is not '
if __name__ == "__main__":
#HOST, PORT = "localhost", 9999
HOST, PORT = "localhost", 50018
# Create the server, binding to localhost on port 9999
server = SocketServer.ThreadingTCPServer((HOST, PORT), MyTCPHandler)
# Activate the server; this will keep running until you
# interrupt the program with Ctrl-C
server.serve_forever()
转载于:https://blog.51cto.com/lvnian/1847532