`
bobning
  • 浏览: 60879 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

用twisted实现的简单ftp服务端

阅读更多
因工作需要,最近写了个twisted的ftp服务端。用户验证用的是django
#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""a very simple ftp server by twisted
"""

__author__ = "Bobning(nb5550606@gmail.com)"


import sys, os
sys.path.append('../../..')
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'

from twisted.protocols import ftp
from twisted.cred import portal, checkers, credentials, error as credError
from twisted.internet import reactor, defer
from zope.interface import implements
from twisted.python import filepath
from django.contrib.auth import authenticate
from django.contrib.auth.models import User


class UserChecker:
    implements(checkers.ICredentialsChecker)
    credentialInterfaces = (credentials.IUsernamePassword,)
    
    def __init__(self):
        "passwords: a dict-like object mapping usernames to passwords"

    
    def requestAvatarId(self, credentials):
        user = authenticate(username=credentials.username, password=credentials.password)
        if user is not None:
            if user.is_active:
                return defer.succeed(credentials.username)
            else:
                return defer.fail(credError.UnauthorizedLogin("access denied"))
        else:
            return defer.fail(credError.UnauthorizedLogin("No such user"))


class MyFTPRealm:
    implements(portal.IRealm)
    
    def __init__(self, anonymousRoot):
        self.anonymousRoot = filepath.FilePath(anonymousRoot)
    
    def requestAvatar(self, avatarId, mind, *interfaces):
        for iface in interfaces:
            if iface is ftp.IFTPShell:
                if avatarId is checkers.ANONYMOUS:
                    avatar = ftp.FTPAnonymousShell(self.anonymousRoot)
                else:
                    try:
                        user = User.objects.get(username=avatarId)
                        ftpdir = user.ftp.all()[0].ftpdir
                    except:
                        raise "没有该用户"
                    avatar = ftp.FTPShell(filepath.FilePath(ftpdir.encode("utf-8")))
                return ftp.IFTPShell, avatar, getattr(avatar, "logout", lambda:None)
        raise NotImplementedError("only IFTPShell interface is supported by this realm")


class MyFtpServer(ftp.FTP):
    def __init__(self, *args, **kw):
        super(ftp.FTP, self).__init__(*args, **kw)

    def dataReceived(self, data):
        self.transport.write(data)


if __name__ == "__main__":
    p = portal.Portal(MyFTPRealm(""))
    p.registerChecker(UserChecker())

    factory = ftp.FTPFactory(MyFtpServer())
    factory.portal = p
    reactor.listenTCP(2121, factory)
    reactor.run()
分享到:
评论

相关推荐

    Python安装scrapy框架的twisted文件(twisted.rar,Twisted-17.9.0.dist-info.rar)

    在Scrapy中,Twisted用于处理网络请求和响应,实现高效的并发和非阻塞I/O操作。安装Scrapy时,如果系统中的Twisted版本过旧或者与Scrapy不兼容,可能会导致安装失败。 1. 安装Scrapy的步骤: - 首先,确保已经安装...

    twisted_demo.zip

    这个 "twisted_demo.zip" 文件包含了一个使用 Twisted 框架实现的客户端和服务器通信的示例,它有助于理解如何利用 Twisted 的核心特性进行长连接通讯。以下是对 Twisted 相关知识点的详细解释: 1. **Twisted 框架...

    网络通信协议:服务端

    在实际应用中,服务端可能会使用框架或库来简化多线程和网络通信的实现,例如Java的NIO(非阻塞I/O)、Python的Twisted库或Node.js的Event Loop模型。这些工具和库提供了高级接口,帮助开发者更高效地处理并发连接。...

    python twisted系列

    5. **测试工具**:Twisted提供了一套完整的测试框架,包括客户端和服务端的模拟工具,便于进行单元测试和集成测试。 6. **任务调度**:Twisted的deferToThread和deferToProcess函数可以将耗时操作放入线程或进程...

    中文Twisted入门教程

    - **服务端开发**:Twisted同样适用于服务器端开发,能够构建高效的服务端应用程序,例如Web服务器、聊天服务器等。 - **扩展性**:Twisted支持多种协议和服务的开发,如SMTP、IMAP、Telnet等,具有良好的扩展性和...

    twisted_资料twisted_资料

    3. **服务端开发**:阐述如何使用Twisted创建服务器,例如通过`reactor.listenTCP`启动一个TCP服务器,处理来自客户端的连接。 4. **客户端连接**:解释如何使用Twisted建立到远程服务器的连接,发送和接收数据,如...

    Socket服务端架构设想

    可以使用线程池或者异步事件驱动模型(如Reactor模式)来管理这些连接,确保服务端能同时处理多个客户端请求。 3. **协议解析**:Socket通信通常基于特定的协议,如HTTP、FTP或自定义协议。服务端需要解析接收到的...

    twsited 中文教程

    教程可能涵盖从基本概念到高级特性的方方面面,包括但不限于事件驱动模型的原理、协议的实现与使用、服务端和客户端的创建、测试策略以及错误处理方法。通过学习,你将能够自信地踏入Python网络编程的大门,为你的...

    Python 基于Twisted框架的文件夹网络传输

    在Python中,Twisted框架是一个强大的异步网络编程库,常用于实现复杂的网络应用,如TCP、UDP、HTTP、FTP等协议。在这个场景中,我们看到一个基于Twisted框架实现的文件夹网络传输示例。这个示例展示了如何通过...

    twisted_smpp_client_server:简单的 smpp 客户端和服务器

    "twisted_smpp_client_server" 是一个基于 Python 的项目,它提供了 SMPP(Short Message Peer-to-Peer)协议的简单客户端和服务器实现。SMPP 是一种行业标准的通信协议,主要用于电信运营商和短信服务提供商之间...

    python基础教程:python如何通过twisted搭建socket服务

    总结来说,本教程介绍了如何使用Python的Twisted库搭建一个简单的TCP Socket服务,包括服务端和客户端的实现。通过这个例子,我们可以了解到Twisted如何处理网络连接、数据交换以及异步通信,这在构建复杂的网络应用...

    Python高效开发实战:Django、Tornado、Flask、Twisted.刘长龙(详细书签

    Twisted提供了一整套网络协议库,包括TCP、UDP、HTTP、SMTP、FTP等,使得开发者能够轻松创建复杂的网络客户端和服务端。它尤其适合构建需要长时间运行、高并发的网络服务,如代理服务器、聊天服务器和分布式系统。 ...

    Python网络编程基础

    - Python可以实现FTP客户端和服务端的开发。 - 应用于文件上传下载等功能。 #### 四、高级网络编程技术 - **多任务处理**: - Python支持多线程、多进程编程,提高程序并发性能。 - 包括Forking、线程和异步IO...

    计算机网络高级软件编程技术—电子版(计算机网络高级教程配套用书)

    6. **网络编程框架**:现代网络编程常使用框架简化开发,如Python的Twisted、Java的Netty、Go的Gorilla等。了解并熟练运用这些框架,可以提升开发效率并降低错误率。 7. **性能优化**:网络应用的性能优化涵盖多个...

    python入门到高级全栈工程师培训 第3期 附课件代码

    07 recv与recvfrom的区别及基于udp实现ntp服务 08 基于tcp实现远程执行命令 09 基于tcp实现远程执行命令测试结果 10 粘包现象 11 粘包解决方法 第31章 01 上节课复习 02 socketserver实现并发 03 socketserver模块...

Global site tag (gtag.js) - Google Analytics