程序员首页投稿(暂停使用,暂停投稿)Python 运维

Twisted学习心得(一)

2016-12-02  本文已影响695人  凌绝少爷

一、基本概念

二、Twisted架构

线程模型.png

注:其中灰色部分为每个任务阻塞在I/O操作上所花的 时间

从上图可以看出:

三、实例呈现

(1)服务器的实现
Server.py

# coding=utf-8
from twisted.internet import reactor
from twisted.internet.protocol import Protocol, Factory

class SimpleProtocol(Protocol):
    def connectionMade(self):
        """客户端连入后向客户端发送一条消息Hello"""
        print 'success from ', self.transport.client
        self.transport.write("Hello")

    def connectionLost(self, reason):
        print self.transport.client, 'disconnected'
        print reason

    def dataReceived(self, data):
        print data

factory = Factory()
factory.protocol = SimpleProtocol

# 在9001端口进行监听
reactor.listenTCP(9001, factory)
# 启动事件循环
reactor.run()

其中SimpleProtocol是我复写的一个Protocol.

(2)客户端的实现
connection.py

# coding=utf-8
from twisted.internet.protocol import ClientFactory, Protocol
from twisted.internet import reactor

class Sender(Protocol):
    def connectionMade(self):
        """连接成功后调用"""
        self.send_command()

    def send_command(self):
        """连接成功后调用他向服务端发送数据"""
        self.transport.write("hello")

    def dataReceived(self, data):
        """进行数据的接受"""
        print "DATA", data

class BasicClientFactory(ClientFactory):
    def __init__(self, protocol):
        self.protocol = protocol
          
    def clientConnectionLost(self, connector, reason):
        print 'Lost connection: %s' % reason.getErrorMessage()

PORT = 9001
HOST = '127.0.0.1'

# 实例化工厂对象
test = BasicClientFactory(Sender)
# 连接服务器
reactor.connectTCP(HOST, PORT, test)

reactor.run()

注:我复写了客户端所需要的工厂ClientFactory

(3)运行测试
先在终端上运行Server.py等待客户端的连入,然后重新开一个终端运行connection.py连接服务器。
会看到客户端和服务端各自收到了一条来自对方的hello的问候消息(如下图所示)。

服务端.png 客户端.png

四、代码原理剖析
(1)

(2)

(3)

温馨提示:

Twisted 没有直接发送数据的函数,发送数据通过Transports 中的 write 进行数据的发送。

部分文字参考http://blog.csdn.net/hanhuili/article/details/9389433

上一篇下一篇

猜你喜欢

热点阅读