--------------------------------ftp_server.py--------------------------------
# coding:utf-8
import os
import json
import socket
import struct
class MyTcpServer():
address_family = socket.AF_INET # AF:address family地址成员 INET:internet network互联网
socket_type = socket.SOCK_STREAM # 流
allow_reuse_address = False # 端口重用
max_packet_size = 1024
coding = "utf-8"
request_queue_size = 5
server_dir = "file_upload"
def __init__(self, server_address, bind_and_activate=True):
self.server_address = server_address
self.socket = socket.socket(self.address_family, self.socket_type)
if bind_and_activate:
try:
self.server_bind()
self.server_activate()
except:
self.server_close()
raise
def server_bind(self):
if self.allow_reuse_address:
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.socket.bind(self.server_address)
self.server_address = self.socket.getsockname()
def server_activate(self):
self.socket.listen(self.request_queue_size)
def server_close(self):
self.socket.close()
def get_request(self):
return self.socket.accept()
def close_request(self, request):
request.close()
def run(self):
while True:
self.conn, self.client_addr = self.get_request()
print("from client ", self.client_addr)
while True:
try:
head_struct = self.conn.recv(4)
if not head_struct: break
head_len = struct.unpack('i', head_struct)[0]
print("head len: ", head_len)
head_json = self.conn.recv(head_len).decode(self.coding)
head_dic = json.loads(head_json)
print("head_dic: ", head_dic)
cmd = head_dic["cmd"]
if hasattr(self, cmd):
func = getattr(self, cmd)
func(head_dic)
except Exception:
break
def put(self, args):
file_path = os.path.normpath(os.path.join(
os.path.dirname(__file__),
self.server_dir,
args['filename']
))
filesize = args['filesize']
print("filesize: ", filesize)
recv_size = 0
print("file_path: ", file_path)
folder_path = os.path.dirname(file_path)
print("path: ", folder_path)
if not os.path.exists(folder_path):
os.makedirs(folder_path)
with open(file_path, "wb") as f:
while recv_size < filesize:
recv_data = self.conn.recv(self.max_packet_size)
f.write(recv_data)
recv_size += len(recv_data)
print("recvsize: %s filesize:%s" % (recv_size, filesize))
ip_port = ("127.0.0.1", 8001)
tcpserver1 = MyTcpServer(ip_port)
tcpserver1.run()
------------------------------------ftp_client.py------------------------------------
# coding:utf-8
import os
import json
import socket
import struct
class MyTcpClient():
address_family = socket.AF_INET
socket_type = socket.SOCK_STREAM
allow_reuse_address = False
max_packet_size = 8192
coding = "utf-8"
request_queue_size = 5
def __init__(self, server_address, connect=True):
self.server_address = server_address
self.socket = socket.socket(self.address_family, self.socket_type)
if connect:
try:
self.client_connect()
except:
self.client_close()
raise
def client_connect(self):
self.socket.connect(self.server_address)
def client_close(self):
self.socket.close()
def run(self):
while True:
inp = input(">>>: ").strip()
if not inp: continue
l = inp.split()
cmd = l[0]
if hasattr(self, cmd):
func = getattr(self, cmd)
func(l)
def put(self, args):
cmd = args[0]
filename = args[1]
if not os.path.isfile(filename):
print("file: %s is not exists" % filename)
return
else:
filesize = os.path.getsize(filename)
head_dic = {
"cmd": cmd,
"filename": os.path.basename(filename),
"filesize": filesize
}
print("head_dic", head_dic)
head_json = json.dumps(head_dic)
head_json_bytes = head_json.encode(self.coding)
head_struct = struct.pack('i', len(head_json_bytes))
self.socket.send(head_struct)
self.socket.send(head_json_bytes)
send_size = 0
with open(filename, "rb") as f:
for line in f:
self.socket.send(line)
send_size += len(line)
print("send_size", send_size)
else:
print("upload successful")
ip_port = ("127.0.0.1", 8001)
client = MyTcpClient(ip_port)
client.run()
先运行tcp_server.py
再运行tcp_client.py
最后输入put 文件名
会在tcp_server.py所在的目录下创建一个file_upload文件夹,并将客户端上传的文件,直接在file_upload下创建.