当前位置: 首页 > 编程日记 > 正文

python twisted 笔记

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

1.Twisted框架构建简单的C/S

要写一个基于twisted框架的服务器,你要实现事件处理器,它处理诸如一个新的客户端连接、新的数据到达和客户端连接中断等情况

在Twisted中,你的事件处理器定义在一个protocol中;你也需要一个factory, 当一个新的连接到达时它能够构造这个protocol对象,但是如果你仅仅想创建一个自定义的Protocol类的实例的话,你可以使用来自 Twisted的factory,Factory类在模块twisted.internet.protocol中。当你写你的protocol时,使用twisted.internet.protocol模块中的Protocol作为你的父类

当你得到一个连接时,事件处理器connectionMade被调用;

当你丢失一个连接时,connectionLost被调用;

客户端接受数据使用处理器dataReceived

但是你不能使用事件处理策略向客户端发送数据;要向客户端发送数据,你可以使用self.transport,它有一个write方法。它也有一个client属性,其中包含了客户端的地址(主机名和端口),即self.transport.client


Eg:

twisted server:

[cpp]

  1. from twisted.internet import reactor

  2. from twisted.internet.protocol import Protocol, Factory

  3. # 定义你Protocol类

  4. class SimpleLogger(Protocol):

  5. def connectionMade(self):

  6. print 'Got connection from', self.transport.client #self.transport.client =客户端主机名和端口

  7. def connectionLost(self, reason):

  8. print self.transport.client, 'disconnected'

  9. def dataReceived(self, data):

  10. print data

  11. # 实例化Factory

  12. factory = Factory()

  13. # 设置factory的protocol属性以便它知道使用哪个protocol与客户端通信(这就是所谓的你的自定义

  14. # protocol)

  15. factory.protocol = SimpleLogger

  16. # 监听指定的端口

  17. reactor.listenTCP(1234, factory)

  18. # 开始运行主程序

  19. reactor.run()


测试的cilent端:

[cpp]

  1. #socket client end

  2. from socket import *

  3. s=socket(AF_INET,SOCK_STREAM)

  4. remote_host=gethostname()

  5. print 'remote_ip:',remote_host

  6. port=1234

  7. s.connect((remote_host,port)) #发起连接

  8. '''

  9. socket对象的getpeername()和getsockname()方法都返回包含一个IP地址和端口的二元组

  10. (这个二元组的形式就像你传递给connect和bind的)。

  11. getpeername返回所连接的远程socket的地址和端口,getsockname返回关于本地socket的相同信息。

  12. '''

  13. print("Connected from",s.getsockname()) ##返回本地IP和端口

  14. print("Connected to",s.getpeername())  ##返回服务端IP和端口

  15. s.send('i am form client')

  16. #print 'what i got from select server is:'

  17. #print s.recv(1024)

  18. '''

  19. send,sendto,recv和recvfrom方法都有一个可选的参数flags,默认值为0。

  20. 你可以通过对socket.MSG_*变量进行组合(按位或)来建立flags的值。

  21. 这些值因平台而有所不同,但是最通用的值如下所示:

  22. MSG_OOB:处理带外数据(既TCP紧急数据)。

  23. MSG_DONTROUTE:不使用路由表;直接发送到接口。

  24. MSG_PEEK:返回等待的数据且不把它们从队列中删除。

  25. '''


运行结果:

server端:

[cpp]

  1. >>> ================================ RESTART ================================

  2. >>>

  3. Got connection from ('172.22.144.167', 5466)

  4. i am form client


client 端:

[cpp]

  1. >>> ================================ RESTART ================================

  2. >>>

  3. remote_ip: PC-200910021344

  4. ('Connected from', ('172.22.144.167', 5466))

  5. ('Connected to', ('172.22.144.167', 1234))

  6. >>>


2.自定义Protocol--利用LineReceiver类作为父类

模块twisted.protocols.basic中包含了几个有用的已存在的protocol,其中的LineReceiver执行dataReceived并在接受到了一个完整的行时调用事件处理器lineReceived。如果当你在接受数据时除了使用lineReceived,还要做些别的,那么你可以使用LineReceiver定义的名为rawDataReceived事件处理器。

Eg:

Server端:

[cpp]

  1. from twisted.internet import reactor

  2. from twisted.internet.protocol import Factory

  3. from twisted.protocols.basic import LineReceiver

  4. class SimpleLogger(LineReceiver):

  5. def connectionMade(self):

  6. print 'Got connection from', self.transport.client

  7. def connectionLost(self, reason):

  8. print self.transport.client, 'disconnected'

  9. #注意必须接收到完整的行(即遇到\r\n结束标志)时该函数才能成功执行

  10. def lineReceived(self, line):

  11. print line

  12. length=len(line)

  13. responsemsg='Dear cilent,I have received '+str(length)+' bytes from you\r\n'

  14. self.transport.write(responsemsg)#向客户端发送数据

  15. factory = Factory()

  16. factory.protocol = SimpleLogger

  17. reactor.listenTCP(1234, factory)

  18. reactor.run()

Client端:

[cpp]

  1. #socket client end

  2. from socket import *

  3. s=socket(AF_INET,SOCK_STREAM)

  4. remote_host=gethostname()

  5. print 'remote_host:',remote_host

  6. port=1234

  7. s.connect((remote_host,port)) #发起连接

  8. print("Connected from",s.getsockname()) ##返回本地IP和端口

  9. print("Connected to",s.getpeername())  ##返回服务端IP和端口

  10. s.send('i am form client\r\n')#发送一行字符串(以\r\n 结束)到服务器端

  11. s.send('next message\r\n')

  12. print 'the msg i got from select server is:'

  13. print s.recv(1024)

运行结果:

Server端:

[cpp]

  1. >>> ================================ RESTART ================================

  2. >>>

  3. Got connection from ('172.22.144.167', 9668)

  4. i am form client

  5. next message

Client端:

[cpp]

  1. >>> ================================ RESTART ================================

  2. >>>

  3. remote_host: PC-200910021344

  4. ('Connected from', ('172.22.144.167', 9668))

  5. ('Connected to', ('172.22.144.167', 1234))

  6. the msg i got from select server is:

  7. Dear cilent,I have received 16 bytes from you

  8. Dear cilent,I have received 12 bytes from you

  9. >>>


3.使用twisted框架创建Web服务器

Web Server 端:

[cpp]

  1. #Main Point:Build Web Server

  2. from twisted.internet import protocol,reactor

  3. from twisted.protocols import basic

  4. class SimpleLogger(basic.LineReceiver):

  5. def connectionMade(self):

  6. print 'Got connection from', self.transport.client

  7. def connectionLost(self, reason):

  8. print self.transport.client, 'disconnected'

  9. def lineReceived(self,line):

  10. print 'data from client are as followings:'

  11. print line

  12. responseData="Welcome to Twisted World!\r\n"

  13. self.transport.write(responseData)

  14. self.transport.loseConnection()  #终止连接

  15. # 实例化protocol.ServerFactory()

  16. '''

  17. protocolp.py

  18. class ServerFactory(Factory):

  19. """Subclass this to indicate that your protocol.Factory is only usable for servers.

  20. """

  21. '''

  22. factory = protocol.ServerFactory()#  ***0120 protocol.ServerFactory()

  23. factory.protocol = SimpleLogger

  24. reactor.listenTCP(6688, factory)

  25. reactor.run()


浏览器客户端测试结果:

Server端运行结果:

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片

  1. >>> ================================ RESTART ================================

  2. >>>

  3. Got connection from ('172.22.144.167', 10293)

  4. Got connection from ('172.22.144.167', 10294)

  5. Got connection from ('172.22.144.167', 10297)

  6. data from client are as followings:

  7. GET / HTTP/1.1

  8. ('172.22.144.167', 10297) disconnected

  9. Got connection from ('172.22.144.167', 10298)

  10. data from client are as followings:

  11. GET /favicon.ico HTTP/1.1

  12. ('172.22.144.167', 10298) disconnected

  13. ('172.22.144.167', 10293) disconnected

  14. ('172.22.144.167', 10294) disconnected

 

4. http请求和响应报文

功能:

返回客户端的请求信息(http请求报文)

Web Server端代码:

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片

  1. from twisted.protocols import basic

  2. from twisted.internet import protocol,reactor

  3. class HttpEchoProtocol(basic.LineReceiver):

  4. def __init__(self):

  5. self.lines=[]

  6. self.gotRequest=False

  7. def lineReceived(self,line):

  8. self.lines.append(line)

  9. if not line and not self.gotRequest:

  10. #0121

  11. print 'the msg browser client send to me(http request head) is:'

  12. for e in self.lines:

  13. print e

  14. #

  15. self.sendResponse()

  16. self.gotRequest=True

  17. def sendResponse(self):

  18. #0121 "\r\n".join(self.lines)  列表中的每一条请求消息字符串均用\r\n连接起来

  19. responseBody="Dear Client,the msg you sent to me are as followings:\r\n\r\n"+"\r\n".join(self.lines)

  20. #send msg to the browser client  0121

  21. #http response head 0121

  22. self.sendLine("HTTP/1.0 200 OK")  #请求成功 0121 (必须) senfLine自动在消息字符串末尾添加\r\n

  23. self.sendLine("Content-Type: text/plain")

  24. self.sendLine("Content-Length: %i"%len(responseBody))

  25. #下面两行语句[1][2]等价  #0121

  26. #self.sendLine("") #http头结束标志  (必须) \r\n  [1]

  27. self.transport.write("\r\n") #[2]

  28. self.transport.write(responseBody) #向客户端发送数据

  29. self.transport.loseConnection()  #终止连接

  30. f=protocol.ServerFactory()

  31. f.protocol=HttpEchoProtocol

  32. reactor.listenTCP(5000,f)

  33. reactor.run()


浏览器测试结果:


服务器端运行结果:


转载于:https://my.oschina.net/pureboys/blog/195066

相关文章:

决策树J48算法

1. J48原理 2. 举例 3. 总结 1. J48原理 基于从上到下的策略,递归的分治策略,选择某个属性放置在根节点,为每个可能的属性值产生一个分支,将实例分成多个子集,每个子集对应一个根节点的分支,然后在每个分支…

分布式系统 一致性模型的介绍 以及 zookeeper的 “线性一致性“ 讨论

文章目录1. 一致性 概览1.1 分布式系统的 “正确性”1.2 线性一致性(Linearizability)1.3 顺序一致性(Sequential consistency)1.4 因果一致性(Casual consistency)1.5 最终一致性(Eventual consistency)2. Zookeeper 的 “线性一致性” 问题3. 参考一致性算是分布式系统的定位…

Java项目:(小程序)全套商城系统(spring+spring mvc+mybatis+layui+微信小程)

源码获取:博客首页 "资源" 里下载! 一、项目简述 本系统功能包括: 商品模块: 商品添加、规格设置,商品上下架等 订单模块: 下单、购物车、支付,发货、收货、评 退款等 营销模块: 积分、优惠券、分销、砍价、拼团、秒 多…

【转】[退役]纪念我的ACM——headacher@XDU

转自:http://hi.baidu.com/headacher/item/5a2ce1d50609091b20e25022 退役了,是时候总结一下我ACM的生涯了。虽然很舍不得,但这段回忆很值得纪念。ACM生涯虽然结束,但是新生活总要继续,还有很多东西需要我去学习&#…

VMware扩大硬盘后修改Linux逻辑卷大小

一、背景随着业务的不断成熟,数据库积累的数据也越来越多了。前些天发现服务器的磁盘将要满了。因此向虚拟化管理员申请增加磁盘空间。由于这个系统是建立在威睿的vSphere平台上的,因此虚拟化管理员只简单地通过 VMware vSphere Client 扩大了磁盘空间&a…

axios与ajax区别

1.jQuery ajax $.ajax({ type: POST, url: url, data: data, dataType: dataType, success: function () {}, error: function () {}});优缺点: 本身是针对MVC的编程,不符合现在前端MVVM的浪潮基于原生的XHR开发,XHR本身的架构不清晰,已经有…

单机 “5千万以上“ 工业级 LRU cache 实现

文章目录前言工业级 LRU Cache1. 基本架构2. 基本操作2.1 insert 操作2.2 高并发下 insert 的一致性/性能 保证2.3 Lookup操作2.4 shard 对 cache Lookup 性能的影响2.4 Erase 操作2.5 内存维护3. 优化前言 近期做了很多 Cache 优化相关的事情,因为对存储引擎较为熟…

Java项目:校园人力人事资源管理系统(java+Springboot+ssm+mysql+jsp+maven)

源码获取:博客首页 "资源" 里下载! 校园人力资源管理系统:学校部门管理,教室管理,学历信息管理,职务,教师职称,奖励,学历,社会关系,工作…

GPS部标平台的架构设计(十)-基于Asp.NET MVC构建GPS部标平台

在当前很多的GPS平台当中,有很多是基于asp.NETsiverlight开发的遗留项目,代码混乱而又难以维护,各种耦合和关联,要命的是界面也没见到比Javascript做的控件有多好看,随着需求的增多,平台已经臃肿不堪。 设计…

关于CSDN不给任何通知强制关闭我的6年博客,我深表痛心

关于CSDN不给任何通知强制关闭我的6年博客,我深表痛心。最近有很长一段时间没有去csdn博客了, 前几天去看的时候发现博客被封闭了。 我联系了管理员,但是没有得到任何回复。 我猜想,可能是不是我在博客文章里面加入 自己网站的网…

Vue 环境搭建(win10)

1.安装node node官网安装地址 推荐安装稳定版本(LTS)以及安装路径为系统盘(C) 查看node安装成功否 注释:以下命令使用 命令提示符(管理员)权限,win10 对user权限的限制了访问权限。node -v 查看…

Java项目:化妆品商城系统(java+Springboot+ssm+mysql+jsp+maven)

源码获取:博客首页 "资源" 里下载! 一、项目简述 本系统主要实现的功能有: 网上商城系统,前台后台管理,用户注册,登录,上架展示,分组展示,搜索,收…

python 绘图脚本系列简单记录

简单记录平时画图用到的python 便捷小脚本 1. 从单个文件输入 绘制坐标系图 #!/usr/bin/python # coding: utf-8 import matplotlib.pyplot as plt import numpy as np import matplotlib as mpl import sysfile_name1 sys.argv[1] data_title sys.argv[2] print(file_name1…

iOS-c语言小练习01

// // main.c // C&#xff0d;变量的地址 // // Created by cgq on 15/4/9. // Copyright (c) 2015年 cgq. All rights reserved. // #include <stdio.h> //访问变量的地址 void test1() { char a A; int b 44; printf("a的值&#xff1a;%d\n",a); pri…

蓝桥杯 【基础练习】 十六进制转八进制

问题描述给定n个十六进制正整数&#xff0c;输出它们对应的八进制数。输入格式输入的第一行为一个正整数n &#xff08;1<n<10&#xff09;。接下来n行&#xff0c;每行一个由0~9、大写字母A~F组成的字符串&#xff0c;表示要转换的十六进制正整数&#xff0c;每个十六进…

泛在网:泛在网

ylbtech-泛在网&#xff1a;泛在网泛在网络来源于拉丁语Ubiquitous&#xff0c;从字面上看就是广泛存在的&#xff0c;无所不在的网络。也就是人置身于无所不在的网络之中&#xff0c;实现人在任何时间、地点&#xff0c;使用任何网络与任何人与物的信息交换&#xff0c;基于个…

Mac 从Makefile 编译 Rocksdb 源码的一些注意事项

文章目录前言Makefile 编译流程1. 平台变量/环境变量的初始化。2. 编译需要的源码文件变量初始化。3. include 目录的设置。4. 编译的执行逻辑。问题记录1&#xff1a;可能的打包命令ar 失效问题5. 执行具体的编译指令问题记录2: jar 包编译前言 最近在Mac 本地编译Rocksdb 过…

Java项目:在线考试系统(单选,多选,判断,填空,简答题)(java+Springboot+ssm+mysql+html+maven)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 功能&#xff1a; 学生信息 班级 专业 学号 姓名 在线考试 成绩查询 个人信息 密码修改 教师管理 教师编号 姓名 所教科目 题库管理 单选题 多选题 填空题 判断题&#xff0c;简答题&#xff08;人工…

看了极光推送技术原理的几点思考

看了极光推送技术原理的几点思考 分类&#xff1a; android2012-11-26 20:50 16586人阅读 评论(18) 收藏 举报目录(?)[] 移动互联网应用现状 因为手机平台本身、电量、网络流量的限制&#xff0c;移动互联网应用在设计上跟传统 PC 上的应用很大不一样&#xff0c;需要根据手机…

查询远程或本地计算机的登录账户

用下面这个函数能获取远程或本地电脑的当前登录用户&#xff0c;同时附加了它的计算机名&#xff0c;所以当你查询多台电脑时将知道结果从哪里来。function Get-LoggedOnUser {param([String[]]$ComputerName $env:COMPUTERNAME)$ComputerName | ForEach-Object {(quser /SERV…

LIS ZOJ - 4028

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode4028 memset超时 这题竟然是一个差分约束 好吧呢 对于每一个a[i], l < a[i] < r 那么设一个源点s 使 l < a[i] - s < r 是不是就能建边了 然后对于每一个f[i] 如果前面有一个相等的f[j] 则肯定 a[i…

存储引擎 K/V 分离下的index回写问题

前言 近期在做on nvme hash引擎相关的事情&#xff0c;对于非全序的数据集的存储需求&#xff0c;相比于我们传统的LSM或者B-tree的数据结构来说 能够减少很多维护全序上的计算/存储资源。当然我们要保证hash场景下的高写入能力&#xff0c;append-only 还是比较友好的选择。 …

经典贪心法:时间序列问题及其全局最优性证明

贪心算法是指在对问题求解时&#xff0c;总做出在当前看来是最好的选择。也就是说&#xff0c;不从整体上加以考虑&#xff0c;它所作出的仅仅是在某种意义上的局部最优解。一旦贪心算法求出了一个可行解&#xff0c;就要确定这个算法是否找到了最优解。为此&#xff0c;要么证…

Java项目:在线水果商城系统(java+JSP+Spring+SpringMVC +MyBatis+html+mysql)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 一、项目简述 功能&#xff1a; 区分为管理员用户和普通用户&#xff0c;普通用户&#xff1a;用户注册登录&#xff0c;首页水果展示&#xff0c;商品分类展示&#xff0c;购物车添加&#xff0c;下单&…

曲苑杂坛--收缩数据库文件

很多人在删除大量数据后收缩数据库&#xff0c;却发现没法收缩到预期效果。 由于使用DBCC SHRINKFILE来收缩数据文件时&#xff0c;是针对数据区来收缩&#xff0c;因此可以先使用DBCC SHOWFILESTATS来查看文件中未使用的分区数(TotalExtents-UsedExtents)&#xff0c;如果删除…

python字典去重

今天实习的web大表哥说帮我看环境不过前提是要我帮他写个python合并列表的demo,大概思路就是利用zip库进行keys和values的遍历&#xff0c;然后在输出就行key1{name1:小明,name2:小红} key2{小明:[men,20],小红:[women,30]} for k,v in zip(key1.values(),key1.keys()):for i, …

关于 线程模型中经常使用的 __sync_fetch_and_add 原子操作的性能

最近从 kvell 这篇论文中看到一些单机存储引擎的优秀设计&#xff0c;底层存储硬件性能在不远的未来可能不再是主要的性能瓶颈&#xff0c;反而高并发下的CPU可能是软件性能的主要限制。像BPS/AEP/Optane-SSD 等Intel 推出的硬件存储栈已经能够在延时上接近DRAM的量级&#xff…

R 语言爬虫 之 cnblog博文爬取

Cnbolg Crawl a). 加载用到的R包 ##library packages needed in this case library(proto) library(gsubfn) ## Warning in doTryCatch(return(expr), name, parentenv, handler): 无法载入共享目标对象‘/Library/Frameworks/R.framework/Resources/modules//R_X11.so’&#…

Java项目:宿舍管理系统(java+jsp+SSM+Spring+mysql)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 一、项目简述 功能&#xff1a;包括学生管理&#xff0c;班级管理&#xff0c;宿舍管理&#xff0c;人员信息维 护。维修登记&#xff0c;卫生管理&#xff0c;访客管理等等。 二、项目运行 环境配置&am…

项目管理5大过程组,42个过程一句话讲解

2019独角兽企业重金招聘Python工程师标准>>> 启动过程组&#xff1a;&#xff08;1&#xff09;制定项目章程&#xff1a;诞生项目&#xff0c;并为项目经理“正名”&#xff1b;&#xff08;2&#xff09;识别干系人&#xff1a;搞清楚谁与项目相关&#xff1b;规划…