python_利用socket实现ftp

  1. 服务器端的实现
# Author : Xuefeng

import socketserver
import json, os

class MyTCPHandler(socketserver.BaseRequestHandler):

    def upload(self, *args):
        '''接受客户端文件'''
        cmd_dic = args[0]
        filename = cmd_dic["filename"]
        filesize = cmd_dic["filesize"]
        print(filename,filesize)
        if os.path.isfile(filename):
            f = open(filename+".new", "wb")
        else:
            f = open(filename, "wb")
        self.request.send(b"200")
        recieved_size = 0
        while recieved_size < filesize:
            data = self.request.recv(1024)
            f.write(data)
            recieved_size += len(data)
        else:
            print("file %s has uploaded..." % filename)


    def handle(self):
        while True:
            try:
                self.data = self.request.recv(1024).strip()
                print("{} wrote".format(self.client_address[0]))
                print(self.data)
                cmd_dic = json.loads(self.data.decode())
                action = cmd_dic["action"]
                if hasattr(self,action):
                    func = getattr(self, action)
                    func(cmd_dic)
            except ConnectionResetError as e:
                print("err: ", e)
                break
if __name__ == '__main__':
    HOST, PORT = "localhost", 9999

    # Create the server, binding to localhost on port 9999
    server = socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler)

    """
    Activate the server: This will keeping running until
    you interrupt the program with Ctrl-C
    """
    server.serve_forever()
  1. 客户端的实现
# Author : Xuefeng

import socket
import os
import json


class FtpClient(object):
    def __init__(self):
        self.client = socket.socket()

    def help(self):
        msg = """
        ls
        pwd
        cd ../..
        upload filename
        load filename
        """

    def connect(self):
        self.client.connect(("localhost", 9999))
        print("connect:", "localhost")

    def interactive(self):
        # self.authenticate
        while True:
            cmd = input(">>").strip()
            if len(cmd) == 0: continue
            cmd_str = cmd.split()[0]
            if hasattr(self, "%s" % cmd_str):
                func = getattr(self, "%s" % cmd_str)
                func(cmd)
            else:
                self.help()

    def upload(self, *args):
        cmd_split = args[0].split()
        if len(cmd_split) > 1:
            filename = cmd_split[1]
            if os.path.isfile(filename):
                filesize = os.stat(filename).st_size
                msg_dic = {
                    "action": "upload",
                    "filename": filename,
                    "filesize": filesize,
                    "overridden": True
                }
                self.client.send(json.dumps(msg_dic).encode("utf-8"))
                # 防止黏包,等服务器确认
                server_response = self.client.recv(1024)
                f = open(filename, "rb")
                for line in f:
                    # print("start")
                    self.client.send(line)
                else:
                    print("upload have done")
                    f.close()

            else:
                print(filename, "is not exist.")

    def load(self):
        pass


ftp = FtpClient()
ftp.connect()
ftp.interactive()

  1. 执行结果
    最终实现客户端将文件上传到服务器端
    输入命令:updata 文件名
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值