首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >3..Twisted学习

3..Twisted学习

作者头像
py3study
发布于 2020-01-20 08:44:11
发布于 2020-01-20 08:44:11
55400
代码可运行
举报
文章被收录于专栏:python3python3
运行总次数:0
代码可运行

写这个主要是为了自己理解Twisted的文档

建立一个finger服务

你不需要调用Twisted,Twisted会自己运行。reactor是Twisted的主循环,想python的其他主循环一样。每个Twisted只有一个reactor。一旦启动他就会不停的运行下去,响应一个又一个请求。

from twisted.internet import reactor返回当前的reactor。如果你不选择一个reactor的话,它会默认选择。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 from twisted.internet import protocol, reactor, endpoints
 2 
 3 class FingerProtocol(protocol.Protocol):
 4     pass
 5 
 6 class FingerFactory(protocol.ServerFactory):
 7     protocol = FingerProtocol
 8 
 9 fingerEndpoint = endpoints.serverFromString(reactor, "tcp:1079")
10 fingerEndpoint.listen(FingerFactory())
11 reactor.run()

这个流程看过前两章的应该很熟悉了,先创建协议,再创建工厂,然后主循环。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 from twisted.internet import protocol, reactor, endpoints
 2 
 3 class FingerProtocol(protocol.Protocol):
 4     def connectionMade(self):
 5         self.transport.loseConnection()
 6 
 7 class FingerFactory(protocol.ServerFactory):
 8     protocol = FingerProtocol
 9 
10 fingerEndpoint = endpoints.serverFromString(reactor, "tcp:1079")
11 fingerEndpoint.listen(FingerFactory())
12 reactor.run()

这个是增加了一个连接之后的初始化配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 from twisted.internet import protocol, reactor, endpoints
 2 from twisted.protocols import basic
 3 
 4 class FingerProtocol(basic.LineReceiver):
 5     def lineReceived(self, user):
 6         self.transport.loseConnection()
 7 
 8 class FingerFactory(protocol.ServerFactory):
 9     protocol = FingerProtocol
10 
11 fingerEndpoint = endpoints.serverFromString(reactor, "tcp:1079")
12 fingerEndpoint.listen(FingerFactory())
13 reactor.run()

这个是按行读取数据,就是按照你的\r\n读取数据,之后关闭连接

写一个读取用户名,返回错误,断开连接的finger

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 from twisted.internet import protocol, reactor, endpoints
 2 from twisted.protocols import basic
 3 
 4 class FingerProtocol(basic.LineReceiver):
 5     def lineReceived(self, user):
 6         self.transport.write(b"No such user\r\n")
 7         self.transport.loseConnection()
 8 
 9 class FingerFactory(protocol.ServerFactory):
10     protocol = FingerProtocol
11 
12 fingerEndpoint = endpoints.serverFromString(reactor, "tcp:1079")
13 fingerEndpoint.listen(FingerFactory())
14 reactor.run()

这个就是按行读取,返回一句话,之后关闭连接

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 from twisted.internet import protocol, reactor, endpoints
 2 from twisted.protocols import basic
 3 
 4 class FingerProtocol(basic.LineReceiver):
 5     def lineReceived(self, user):
 6         self.transport.write(self.factory.getUser(user)+ b"\r\n")
 7         self.transport.loseConnection()
 8 
 9 class FingerFactory(protocol.ServerFactory):
10     protocol = FingerProtocol
11 
12     def getUser(self, user):
13         return b"No such user"
14 
15 fingerEndpoint = endpoints.serverFromString(reactor, "tcp:1079")
16 fingerEndpoint.listen(FingerFactory())
17 reactor.run()

增加获取用户名的函数

在协议之中调用工厂方法,可以用self.factory,这个就是指向工厂的,因为工厂类实际上是它的父类。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 from twisted.internet import protocol, reactor, endpoints
 2 from twisted.protocols import basic
 3 
 4 class FingerProtocol(basic.LineReceiver):
 5     def lineReceived(self, user):
 6         self.transport.write(self.factory.getUser(user) + b"\r\n")
 7         self.transport.loseConnection()
 8 
 9 class FingerFactory(protocol.ServerFactory):
10     protocol = FingerProtocol
11 
12     def __init__(self, users):
13         self.users = users
14 
15     def getUser(self, user):
16         return self.users.get(user, b"No such user")
17 
18 fingerEndpoint = endpoints.serverFromString(reactor, "tcp:1079")
19 fingerEndpoint.listen(FingerFactory({ b'moshez' : b'Happy and well'}))
20 reactor.run()

初始化一个字典,如果你输入的用户名没有在字典里边,就会返回默认值。

Defereds

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 from twisted.internet import protocol, reactor, defer, endpoints
 2 from twisted.protocols import basic
 3 
 4 class FingerProtocol(basic.LineReceiver):
 5     def lineReceived(self, user):
 6         d = self.factory.getUser(user)
 7 
 8         def onError(err):
 9             return 'Internal error in server'
10         d.addErrback(onError)
11 
12         def writeResponse(message):
13             self.transport.write(message + b'\r\n')
14             self.transport.loseConnection()
15         d.addCallback(writeResponse)
16 
17 class FingerFactory(protocol.ServerFactory):
18     protocol = FingerProtocol
19 
20     def __init__(self, users):
21         self.users = users
22 
23     def getUser(self, user):
24         return defer.succeed(self.users.get(user, b"No such user"))
25 
26 fingerEndpoint = endpoints.serverFromString(reactor, "tcp:1079")
27 fingerEndpoint.listen(FingerFactory({b'moshez': b'Happy and well'}))
28 reactor.run()

在这个里边,我么使用了defer,其实也就仅仅修改了getUser方法。Defereds循序由事件驱动程序,也就是说,如果程序中的一个任务正在等待数据,程序可以去执行其他操作,这叫做异步执行。

上边的代码测试了一下,是按照队列执行的,就是说两个客户端发送数据,如果第一个客户端设置延迟返回5秒,那么之后5秒后,第二个客户端才会被响应。

解释一下deferred:

大家可以去看

https://www.cnblogs.com/zhangjing0502/archive/2012/05/16/2504415.html  作者:很多不懂呀。。

Twisted

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 from twisted.application import service, strports
 2 from twisted.internet import protocol, reactor, defer
 3 from twisted.protocols import basic
 4 
 5 class FingerProtocol(basic.LineReceiver):
 6     def lineReceived(self, user):
 7         d = self.factory.getUser(user)
 8 
 9         def onError(err):
10             return 'Internal error in server'
11         d.addErrback(onError)
12 
13         def writeResponse(message):
14             self.transport.write(message + b'\r\n')
15             self.transport.loseConnection()
16         d.addCallback(writeResponse)
17 
18 class FingerFactory(protocol.ServerFactory):
19     protocol = FingerProtocol
20 
21     def __init__(self, users):
22         self.users = users
23 
24     def getUser(self, user):
25         return defer.succeed(self.users.get(user, b"No such user"))
26 
27 application = service.Application('finger', uid=1, gid=1)
28 factory = FingerFactory({b'moshez': b'Happy and well'})
29 strports.service("tcp:79", factory, reactor=reactor).setServiceParent(
30     service.IServiceCollection(application))

可能你已经发现了,我们的协议类从上边开始就没变过,事实上,以后也很少会变了,主要是在工厂里更改。

这个例子是告诉twisted您的应用程序在哪里,使用的是application

from twisted.application import service,strports

在这里我们没有再使用serverFormString来设置地址端口,我们用了他的应用程序来启动,strports.service。注意,当它被实例化的时候,这个程序对象不会引用协议和工厂!

任何把application当做父对象的服务将会在twisted启动的时候被启动。总之,他就是来管理启动服务和关闭服务的。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/04/17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
CA数字证书怎么用 CA数字证书收费标准
  CA数字证书也就是权威的CA机构颁发的SSL证书,可保护网站数据安全不被窃取、泄露,而且有利于SEO关键词优化,是网站安全解决方案之一。
安信SSL证书
2019/08/27
8.9K0
CA数字证书怎么用 CA数字证书收费标准
通配符证书和单域名SSL证书的区别
  通配符证书和单域名SSL证书有什么区别?首先,我们先来了解通配符证书和单域名SSL证书的定义:
安信SSL证书
2019/07/31
6.8K0
通配符证书和单域名SSL证书的区别
SSL证书类型
图片 SSL证书具有服务器身份认证和数据加密传输的重要作用,在国家政策和各大主流浏览器的推动下,SSL证书早已成为我国网站的标配。但对于大部分企业来说,在建设网站时所面临的问题并不是要不要安装SSL
柳絮云泡泡
2023/03/08
2.5K0
SSL证书类型
SSL证书是什么?SSL证书怎么申请?
  SSL证书是数字证书的一种,由权威数字证书机构(CA)验证网站身份后颁发,可实现浏览器和网站服务器数据传输加密。网站安装SSL证书后会在浏览器显示安全锁标志,数据传输协议从http(传统协议) 升级为 https(加密协议)。
安信SSL证书
2019/08/15
10.4K0
SSL证书是什么?SSL证书怎么申请?
如何选择合适的SSL证书类型
  网站安装SSL证书就可以将http升级为https加密模式,网站安装SSL证书因此成为一种趋势。如何为网站选择适合的SSL证书类型呢?
安信SSL证书
2019/08/05
1.8K0
如何选择合适的SSL证书类型
HTTPS证书知识扫盲
现在搞网站域名不加个HTTPS就显得不专业,特别在使用JWT进行认证的接口一定要加HTTPS为你的接口增加一层安全屏障。今天就来聊聊配置HTTPS的关键SSL证书,也被称为CA证书。
码农小胖哥
2020/09/28
1.9K0
如何选择保护网站安全的SSL证书?看完这篇,你才会选对!
在网络安全领域,SSL证书经常作为传输数据安全保护的重要措施被大家所看到,但是市面上的单域名证书、多域名证书、DV证书、OV证书等等傻傻分不清楚。今天梳理了2个表格对比,来跟大家详细讲一下。
做个网站就这么简单
2025/04/12
1410
如何选择保护网站安全的SSL证书?看完这篇,你才会选对!
一文读懂SSL证书以及https对于网站安全的重要性
SSL证书是数字证书的一种,类似于驾驶证、护照和营业执照的电子副本。因为配置在服务器上,也称为SSL服务器证书。
追梦者
2019/01/22
1.4K0
一文读懂SSL证书以及https对于网站安全的重要性
域名验证型DV SSL证书相关评测
  域名验证型DV SSL证书顾名思义就是只验证域名所有权的SSL证书,是一款基础性入门SSL证书,比较适合小型企业和个人网站类的用户申请安装。
安信SSL证书
2019/08/22
2.6K0
域名验证型DV SSL证书相关评测
SSL证书类型选择和区别
DV域名级SSL证书:DV域名级SSL证书非常适合基本网站,小型博客,在线投资组合,信息站点,摄影站点和小型企业。它是拥有网站的任何人都可以负担得起的入门级产品,等待时间通常只需五分钟。
柳絮云泡泡
2023/03/10
1K0
SSL证书类型选择和区别
怎么选择SSL证书?
看到HTTPS证书,可能很多人会觉得陌生,其实它就是SSL证书的另一种称谓,因为网站部署SSL证书后才能实现HTTPS链接,所以很多人也称它为HTTPS证书。
柳絮云泡泡
2023/03/02
2K0
怎么选择SSL证书?
SSL证书是什么?SSL证书的作用
在互联网的快速发展中,网络安全已经成为一个不可忽视的话题。SSL证书,作为一种保障网络数据传输安全的重要工具,对于网站管理员、电子商务平台、在线支付系统以及任何需要保护用户敏感信息的组织来说,都是至关重要的。本文将深入探讨SSL证书的概念、作用、类型、历史发展以及如何选择合适的SSL证书。
沃通WoTrus数字证书
2024/04/03
3.8K0
SSL证书是什么?SSL证书的作用
SSL数字证书如何选择适合自己的?https证书如何选择
域名验证(DV):这是最基本的验证级别,仅验证您对域名的所有权。它通常是价格最便宜的选项,并且适用于个人网站、博客或非商业网站。
网盾JoySSL小张
2023/08/18
5970
SSL证书的分类有哪些?如何选择合适的SSL证书?
为了保护网站数据和用户信息,很多企业开始为网站安装SSL证书,有效提升了网站安全性。那么SSL证书的分类有哪些?如何选择合适的SSL证书?
稀糊牛肉粥
2023/09/25
1.1K0
什么是多域名通配符SSL证书?
多域名通配符SSL – 安全多域名和子域名 多域名通配符SSL证书是结合通配符SSL和多域名SSL两者的组合特征而成。在多域名通配符SSL证书下,用户可以保护多个完全合格的域名及其无限数量的子域(达到第一级)。 多域名通配符SSL是用户保护多个域名以及无限数量子域名的绝佳选择。单多域名通配符SSL证书对于多域名和子域名的管理是有利的,因为可节省了时间和金钱。 多域名通配符SSL证书可用于域名验证(DV)和组织验证(OV)选项。根据数字证书颁发机构(CA)的验证过程,OV SSL证书最多可能需要3天,而D
企鹅号小编
2018/02/01
4.8K0
什么是多域名通配符SSL证书?
DV 多域名 SSL证书
当网站展现在因特网中,就会有信息泄露的危险,因为一般网站传输信息都是用http安全协议,数据都是明文传输,数据容易被截取或者篡改,所以为了网站发展和对用户隐私的保护就有了https安全协议,这其实就是在网站传输信息时对网站信息进行128-256位加密,使信息传输加了一个安全套接层,有效地保护了网站安全。
柳絮云泡泡
2023/02/13
5.3K0
DV 多域名 SSL证书
域名数字证书安全漫谈(3)-您被证书服务机构忽悠了吗?
各证书机构及中间服务商,在对证书分类的时候,所使用的名称五花八门,有的服务商不使用通用的分类名称,而是使用自己分类的品牌名。公司周边同事也分不清这些证书到底有什么区别,只好听证书机构的人员推荐,很多时候按照价格最高的证书类型采购了。
用户U2
2022/06/02
1K0
域名数字证书安全漫谈(3)-您被证书服务机构忽悠了吗?
DV,OV,EV证书优势区别
互联网在国内最近20年的发展,使得网民数量迅速增长,很多用户在访问网站时,对使用HTTP协议已经习以为常,但随着时代的发展,网络技术的革新也是日新月异,HTTPS协议的诞生满足了用户对网站安全的需求,并且正日益成为网络安全领域的潮流和新趋势。
JoySSL
2023/02/03
1.8K0
DV,OV,EV证书优势区别
从HTTP变成HTTPS,SSL证书究竟发挥什么作用?
近年,“互联网+”作为经济发展的主流方向,各行各业均开展与互联网的融合,积极建立线上品牌与业务。网络上出现的“中国新四大发明”,其中与互联网密切相关的就占了一半,分别是“在线支付”与“网络购物”。
后端码匠
2020/07/15
1.1K0
从HTTP变成HTTPS,SSL证书究竟发挥什么作用?
什么是SSL证书?为什么要买SSL证书?
SSL证书是数字证书的一种,类似于驾驶证、护照和营业执照的电子副本。因为配置在服务器上,也称为SSL服务器证书。
柳絮云泡泡
2023/02/24
6.6K0
什么是SSL证书?为什么要买SSL证书?
相关推荐
CA数字证书怎么用 CA数字证书收费标准
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验