码迷,mamicode.com
首页 > 编程语言 > 详细

python网络框架Twisted

时间:2019-05-03 22:30:27      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:net   reac   obj   prot   包括   stdout   internet   class   udp   

什么是Twisted

Twisted是一个用python语言写的事件驱动网络框架,它支持很多种协议,包括UDP,TCP,TLS和其他应用层协议,比如HTTP,SMTP,NNTM,IRC,XMPP/Jabber。

一个Twisted程序由reactor发起的主循环和一些回调函数组成。当事件发生了,比如一个client连接到了server,这时候服务器端的事件会被触发执行。

官方的简单例子启动Twisted:

from twisted.internet import reactor

def hello():
    print(Hello from the reactor loop!)
    print(Lately I feel like I\‘m stuck in a rut.)

# 将函数hello传入reactor
reactor.callWhenRunning(hello)
print(Starting the reactor.)
# 启动reactor后调用hello函数
reactor.run()

退出Twisted:

from  twisted.internet import reactor

class Countdown(object):
    counter=5
    def count(self):
        if self.counter==0:
            # 停止reactor的循环监听
            reactor.stop()
        else:
            print(self.counter,"...")
            self.counter-=1
            # 注册一个回调函数第一个参数是几秒回调,第二个参数是回调函数
            reactor.callLater(1,self.count)

reactor.callWhenRunning(Countdown().count)

print("start")
reactor.run()
print("stop!")

#执行结果
start
5 ...
4 ...
3 ...
2 ...
1 ...
stop!

twisted中出现异常,程序并不会崩溃:

from twisted.internet import reactor

# 异常函数
def falldown():
    raise Exception(I fall down.)

# 重启函数
def upagain():
    print(But I get up again.)
    # 注销stop,程序会继续执行,并不会崩溃,说明twisted的健壮性
    reactor.stop()

reactor.callWhenRunning(falldown)
reactor.callWhenRunning(upagain)

print(Starting the reactor.)
reactor.run()

 

用Twisted写一个简单的TCP服务器

下面的代码是一个TCPServer,这个server记录客户端发来的数据信息。

import sys

from twisted.internet.protocol import ServerFactory
from twisted.protocols.basic import LineReceiver
from twisted.python import log
from twisted.internet import reactor

class CmdProtocol(LineReceiver):
    # 分隔符
    delimiter = "\n"

    # 连接成功事件,可重载
    def connectionMade(self):
        # 获取客户端的ip
        # getPeer获取客户端信息
        # getHost获取服务端信息
        self.client_ip=self.transport.getPeer().host# 日志记录来访客户端的ip
        log.msg("Client connection from %s" % self.client_ip)
        # 如果连接的客服端数量大于最大连接数,那么就关闭连接
        if len(self.factory.clients)>=self.factory.clients_max:
            log.msg("Too many connections. bye !")
            self.client_ip=None
            # 关闭连接
            self.transport.loseConnection()
        else:
            self.factory.clients.append(self.client_ip)

    # 连接断开事件,可重载,依靠reason区分断开类型
    def connectonLost(self,reason):
        log.msg(Lost client connection. Reason: %s % reason)
        if self.client_ip:
            self.factory.clients.remove(self.client_ip)

    # 继承父类的方法,用于分发事件,不要重载
    def lineReceived(self, line):
        log.msg(Cmd received from %s : %s % (self.client_ip, line))


class MyFactory(ServerFactory):
    # 指向一个协议类,我们自定义的
    protocol = CmdProtocol

    def __init__(self,clients_max=10):
        self.clients_max=clients_max
        self.clients=[]

# 配置将日志输出到stdout
log.startLogging(sys.stdout)
reactor.listenTCP(9999,MyFactory(2))
reactor.run()

#在cmd中输入:
Telnet 127.0.0.1 9999 测试

 

python网络框架Twisted

标签:net   reac   obj   prot   包括   stdout   internet   class   udp   

原文地址:https://www.cnblogs.com/angelyan/p/10806640.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!