协议处理类通常会子类化twisted.com .internet.protocol. protocol。大多数协议处理程序从这个类继承,或者从它的一个方便子类继承。协议类的实例按连接实例化,按需实例化,并在连接完成时消失。这意味着持久化配置不会保存在协议中。

持久化配置保存在工厂类中,工厂类通常继承自twisted.com .internet.protocol.Factory。工厂的buildProtocol方法用于为每个新连接创建Protocol。

能够在多个端口或网络地址上提供相同的服务通常很有用。这就是为什么工厂不监听连接,实际上不知道任何关于网络的信息。

Twisted协议以异步方式处理数据。当事件从网络到达时,协议protocol响应它们,而事件到达将调用协议上的方法。

这是最简单的协议之一。它只是简单地回写所写的内容,而不响应所有事件。

#!/usr/bin/env python2
# -*- coding: utf-8 -*-from twisted.internet.protocol import Protocol
class Echo(Protocol):def dataReceived(self, data): self.transport.write(data)

下面是一个协议响应另一个事件的例子:

from twisted.internet.protocol import Protocol
class QOTD(Protocol):def connectionMade(self):self.transport.write("一天一苹果,不用请医生\r\n") self.transport.loseConnection()

这个协议用一个名言响应初始连接,然后终止连接。
connectionMade事件通常相应连接对象启动发生,以及任何初始的问候语(如上面的QOTD协议)。connectionLost事件应用于任何特定于连接的对象消失。下面是一个例子:

from twisted.internet.protocol import Protocol
class Echo(Protocol):def __init__(self, factory):self.factory = factory
def connectionMade(self):self.factory.numProtocols = self.factory.numProtocols + 1self.transport.write("欢迎,这是第%d个运行中的连接\n" % (self.factory.numProtocols,))
def connectionLost(self, reason):self.factory.numProtocols = self.factory.numProtocols - 1
def dataReceived(self, data): self.transport.write(data)

工厂用于共享存在于超过任何给定连接的生命周期的状态。

在Echo协议代码中,loseConnection是在写入传输之后立即调用的。只有当Twisted将所有数据写完入操作系统时,loseConnection调用才会关闭连接,因此在这种情况下使用它是安全的,无需担心传输写入丢失。如果生产者与传输一起使用,loseConnection只会在生产者解除注册时关闭连接。在某些情况下,等待所有数据被写出来并不是我们想要的。由于网络故障、bug或另一端连接者的恶意,写入到传输端的数据可能无法交付,因此即使调用loseConnection,连接也不会丢失。在这些情况下,可以使用abortConnection:它立即关闭连接,而不管传输中仍然未写入的缓冲数据或仍然有注册的生产者。

在本例中,我创建了一个协议工厂。我想告诉这个工厂它的任务是构建QOTD协议实例,所以我设置了它的buildProtocol方法来返回QOTD类的实例。然后,我想在一个TCP端口上侦听,因此我创建了一个TCP4ServerEndpoint来标识我想绑定到的端口,然后将我刚刚创建的工厂传递到它的侦听方法。
listen()告诉反应器使用特定的协议来处理到端点地址的连接,但是反应器需要运行才能执行任何操作。run()启动反应器,然后永远等待连接到达指定的端口。您可以通过在终端中按Control-C或调用reactor.stop()来停止反应器。

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on Sun Sep 16 15:27:20 2018@author: myhaspl
@email:myhaspl@myhaspl.com
server
"""
from twisted.internet.protocol import Factory
from twisted.internet.endpoints import TCP4ServerEndpoint
from twisted.internet import reactor
from twisted.internet.protocol import Protocol class QOTD(Protocol):#协议类def connectionMade(self):self.transport.write("您好!欢迎您的登录,再见!\r\n") self.transport.loseConnection()class QOTDFactory(Factory):def buildProtocol(self, addr):return QOTD()endpoint = TCP4ServerEndpoint(reactor, 21200)
endpoint.listen(QOTDFactory())
reactor.run()

============================

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on Sun Sep 16 15:27:20 2018@author: myhaspl
@email:myhaspl@myhaspl.com
server
"""
from twisted.internet.protocol import Factory
from twisted.internet.endpoints import TCP4ServerEndpoint
from twisted.internet import reactor
from twisted.internet.protocol import Protocol class QOTD(Protocol):#协议类def connectionMade(self):self.transport.write("您好!欢迎您的登录,再见!\r\n") self.transport.loseConnection()class QOTDFactory(Factory):def buildProtocol(self, addr):return QOTD()if __name__=="__main__":endpoint = TCP4ServerEndpoint(reactor, 21210)endpoint.listen(QOTDFactory())reactor.run()

=============================

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on Sun Sep 16 15:28:44 2018@author: myhaspl
@email:myhaspl@myhaspl.com
client
"""from twisted.internet.protocol import Protocol
from twisted.internet.protocol import ClientFactory
from twisted.internet import reactorHOST="localhost"
PORT=21210
class ClientMessage(Protocol):#协议类def connectionMade(self):data=raw_input("请输入要发送给服务器的消息")self.transport.write(data)def dataReceived(self, data):print data       self.transport.loseConnection()class ClientMessageFactory(ClientFactory):#工厂类def startedConnecting(self, connector):print '开始连接'def buildProtocol(self, addr):print '已经连接.'return ClientMessage()def clientConnectionLost(self, connector, reason):print '%s==>连接丢失!'%reasondef clientConnectionFailed(self, connector, reason):print '%s==>连接错误!'%reasonif __name__=="__main__":reactor.connectTCP(HOST, PORT, ClientMessageFactory())reactor.run()

客户端

开始连接
已经连接.
请输入要发送给服务器的消息hi
您好!欢迎您的登录,再见!

[Failure instance: Traceback (failure with no frames): <class ‘twisted.internet.error.ConnectionDone’>: Connection was closed cleanly.
]==>连接丢失!

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on Sun Sep 16 15:27:20 2018@author: myhaspl
@email:myhaspl@myhaspl.com
server
"""
from twisted.internet.protocol import Factory
from twisted.internet.endpoints import TCP4ServerEndpoint
from twisted.internet import reactor
from twisted.internet.protocol import Protocol
import timeclass QOTD(Protocol):#协议类def connectionMade(self):print "接受连接"self.transport.write("您好!欢迎您的登录,再见!\r\n") def dataReceived(self, data):if data:print "客户端发来消息:%s"%data self.transport.write("[%s]:%s"%(time.ctime(),data))self.transport.loseConnection()
class QOTDFactory(Factory):def buildProtocol(self, addr):return QOTD()if __name__=="__main__":endpoint = TCP4ServerEndpoint(reactor, 21210)endpoint.listen(QOTDFactory())reactor.run()

接受连接
客户端发来消息:hello,1

#!/usr/bin/env python2
# -*- coding: utf-8 -*-"""
Created on Sun Sep 16 15:28:44 2018@author: myhaspl
@email:myhaspl@myhaspl.com
client
"""from twisted.internet.protocol import Protocol
from twisted.internet.protocol import ClientFactory
from twisted.internet import reactorHOST="localhost"
PORT=21210
class ClientMessage(Protocol):#协议类def connectionMade(self):data=raw_input("请输入消息:")self.transport.write(data)def dataReceived(self, data):print "服务器回应:%s"%data       class ClientMessageFactory(ClientFactory):#工厂类def startedConnecting(self, connector):print '开始连接'def buildProtocol(self, addr):print '已经连接.'return ClientMessage()def clientConnectionLost(self, connector, reason):print '%s==>连接丢失!'%reasondef clientConnectionFailed(self, connector, reason):print '%s==>连接错误!'%reasonif __name__=="__main__":reactor.connectTCP(HOST, PORT, ClientMessageFactory())reactor.run()

开始连接
已经连接.
请输入消息:hello,1
服务器回应:您好!欢迎您的登录,再见!

服务器回应:[Sun Sep 16 16:37:08 2018]:hello,1
[Failure instance: Traceback (failure with no frames): <class ‘twisted.internet.error.ConnectionDone’>: Connection was closed cleanly.
]==>连接丢失!

twsited快速基础相关推荐

  1. MySQ快速基础篇_MySQL数据库基础

    MySQ快速基础篇_MySQL数据库基础 文章目录 MySQ快速基础篇_MySQL数据库基础 MySQL数据库基础 学习目录 学习目标 一.数据库概述 1.数据库介绍 2.数据库分类 ☆ 关系型数据库 ...

  2. Linux 快速基础篇__Linux操作系统

    Linux 快速基础篇__Linux操作系统 Linux操作系统 文章目录 Linux 快速基础篇__Linux操作系统 Linux操作系统 学习目标 一.操作系统概述 1.计算机分类 2.计算机组成 ...

  3. 快上车 全套Python零基础入门教程免费分享 !

    前言 随着近年来Python的兴起,数学建模的语言不仅限于c.c++和matlab,python由于本身自带的科学计算库以及一些图形可视化库,python也成为数学建模的常用编程语言之一. 我们都知道 ...

  4. 2020年 TPAMI长文, Ball k-means:一种无界的快速自适应精确k-means算法

    k-means是人工智能领域最常用的快速基础算法之一,广泛用于聚类.数据预分析及与改进其他机器学习算法等.为了进一步提高k-means算法效率,很多优秀的k-means算法通过对每个样本维持一个上下界 ...

  5. Ball k-means:一种无界的快速自适应精确k-means算法

    k-means是人工智能领域最常用的快速基础算法之一,广泛用于聚类.数据预分析及与改进其他机器学习算法等.为了进一步提高k-means算法效率,很多优秀的k-means算法通过对每个样本维持一个上下界 ...

  6. 《深入理解Android:Wi-Fi,NFC和GPS》章节连载[节选]--第三章 Wi-Fi基础知识

    首先感谢各位兄弟姐妹们的耐心等待.本书预计在3月中旬上市发售.从今天开始,我将在博客中连载此书的一些内容.注意,此处连载的是未经出版社编辑的原始稿件,所以样子会有些非专业. 注意,如下是本章目录,本文 ...

  7. Elasticsearch:如何使用 Elasticsearch 和 Python 构建面部识别系统

    你是否曾经尝试在图像中搜索目标? Elasticsearch 可以帮助你存储,分析和搜索图像或视频中的目标. 在本快速教程中,我们将向你展示如何构建一个使用 Python 进行面部识别的系统. 了解有 ...

  8. 一些学习经验总结(个人随笔)

    一.每个板块都有不同对应的学习方法: 1.算法(源码):考试方法+开卷方法,他们之间的逻辑不一样的. 2.基础知识:快速基础方法+搜集练习填充到课程笔记本. 3.框架知识(项目):上来看实现效果什么 ...

  9. 《数据通信与网络》笔记--无线局域网

    802.11是IEEE制定的一个无线局域网标准.全家族如下: *IEEE 802.11,1997年,原始标准(2Mbit/s,工作在2.4GHz). * IEEE802.11a,1999年,物理层补充 ...

最新文章

  1. 【控制】《复杂运动体系统的分布式协同控制与优化》-方浩老师-第9章-固定翼飞行器的编队跟踪与队形旋转控制
  2. python中使用sys模板和logging模块获取行号和函数名的方法
  3. ModuleNotFoundError: No module named ‘pycocotools‘
  4. 通过迁移的方式解决Active Directory服务器问题之6
  5. echart 饼图标题title的详细参数配置
  6. SylixOS Makefile 源代码解析
  7. Windows 上 curl 的安装
  8. 工作模板-----MySQL示例
  9. 腾讯云TBase分布式数据库安装部署
  10. 360杀毒软件无视宏病毒!
  11. Linux——根目录结构
  12. 苹果公司发展史_苹果公司的发展历史
  13. 金属非金属如何去毛刺 机器人浮动去毛刺
  14. 你知道域名劫持的重要性吗? 教你防范网站被域名劫持
  15. 西安交通大学轴承公共数据集(文末附数据)
  16. linux能做什么?
  17. android 触摸 唤醒屏幕,android 怎么通过触摸屏幕来唤醒屏幕。
  18. linux制作剪刀石头布游戏,C#实现剪刀石头布游戏
  19. 数据结构与算法分析-二叉树,树和森林
  20. hive中内部表和外部表有什么区别?一般什么时候使用内部表什么时候使用外部表?

热门文章

  1. 第二章:2.6 使用 runserver 命令把项目运行起来
  2. mysql如何查找某字段所在表
  3. .ascx是什么文件?
  4. #讲座#低碳经济0814
  5. Binary classification - 聊聊评价指标的那些事儿【实战篇】
  6. PAT (Basic Level) Practice (中文)1023 组个最小数 (20 分) (排序)
  7. Windows server 1709(不含UI)模板部署
  8. 湖南雅礼培训 1.1
  9. hdu2063 二分图(基础题)
  10. system函数和fork-exec机制