使用twised实现一个EchoServer
Protocols
Protocols描述了如何以异步的方式处理网络中断时间,HTTP、DNS已经IMAP是应用应用层协议中的例子,
Protocols实现了IProtocol接口,它饱和如下的方法 makeConnection 在transport对象和服务器之间建立一条连接
connectionMade 连接建立起来后调用
dataReceived 接受数据的时候调用
connectionLost 关闭连接时候调用 Transports
代表2个节点之间的通信,负责描述连接是细节,
Transports实现了ITtansports接口,它包含如下的方法 write 以非阻塞的方式按顺序依次将数据写到物理连接上,如果遇到阻塞会立刻切换
writeSequence 将一个字符串列表写到物理连接上,把列表中的每个元素以一个一个写过去
loseConnection 将所有挂挂起的数据写入,然后关闭连接,即先把未完成的数据传输完成在关闭
getPeer 取的连接中对端的地址信息
getHost 取得连接中本端的地址信息 服务端思路梳理
总结一下:
1、调用main方法来启动脚本
2、一个客户端过来
3、执行protocol.ServerFactory类中定义的默认的方法
4、执行factory.protocol类中定义的方法 客户端思路梳理
总结
1、调用main方法来启动脚本
2、main方法会首先会创建一个客户端的对象,然后通过reactor用这个对象去连接服务端
3、在来看EehoFactory这个客户端的类做什么工作
a、首先把一个客户端的类赋值给了protocol,这个就相当于socketer中的handle
b、clientConnectionFailed,该方法定义如果连接失败该如何处理
c、clientConnectionLost,该方法定义如果传输过程中失败该如何处理
4、我们又定义EchoClient类,这个类就是handle,定义客户端和服务端之间是如何工作的
a、connectionMade,该方法,只有客户端一旦连接上服务端,就会自动调用该方法,我们在该方法中写我们要执行的动作,就比如你连接上一个服务端你会干什么,在这里我们写的发送一个字符串
b、dataReceived,该方法,只要从服务端接收到数据,就会自动调用该方法,我们在该方法中写当我们收到服务端的数据的时候要执行什么,在这里我们写的是关闭连接
c、connectionLost,该方法,只要客户端和服务端之间的连接中断,要执行的操作 终于看到twisted的套路了,可能理解的不够全面
1、写一个基类,这个基类必须要继承protocl的一个类,这个是twisted框架所要求的,这个基类的作用就是定义一些默认的方法,比如我们在学习socketserver的时候,有setup方法和finish方法
2、写一个基本的方法,这个方法就是主要有连接过来,就会自动触发的方法,这个方法的作用就类似于socketserver中的handle方法
3、在写一个reactor的方法,该方法就会时时监听某个端口,看是否有连接进来,如果有连接进来,就会为这个客户端的连接创建一个实例,这个实例就是实例化步骤1中创建的基类
先看服务端的代码
from twisted.internet import protocol
from twisted.internet import reactor class Echo(protocol.Protocol):
def dataReceived(self, data):
#只要twisted一收到数据就会调用此方法dataReceived,收到数据后干什么,他就不知道了
#这里写的意思就是收到后在发回去给客户端
self.transport.write(data) def main():
factory = protocol.ServerFactory()
#服务器工厂,和客户端建立连接后定义的某些方法,比如发送数据或者文件
#除了这些,还有一些默认的方法,可以理解为定义一个基础的工厂类,比如
# soceketserver方法中的setup方法,和finsh方法 factory.protocol = Echo
#相当于socketserver中的handle,必须要写,每个客户端过来都会建立一个
# 实例,然后就调用Echo这个方法 reactor.listenTCP(9000,factory)
#相当于一个触发器,监听9000端口,把我们定义的基础类放在这里,和socketserver中一样 reactor.run() if __name__ == '__main__':
main()
在看客户端的代码
from twisted.internet import reactor
from twisted.internet import protocol class EchoClient(protocol.Protocol):
def connectionMade(self):
#只要链接一建立,就会自动调用此方法
print "client send data to server"
self.transport.write("hello world") def dataReceived(self, data):
#只要有数据收到,就会调用该方法,这个都是自动的
print "Server said",data
self.transport.loseConnection()
#这里收到数据后,打印数据,然后就关闭链接了,调用这个方法loseConnection,reactor会自动调用connectionLost方法 def connectionLost(self, reason):
print "Connection lost" class EehoFactory(protocol.ClientFactory):
protocol = EchoClient
#相当于handle def clientConnectionFailed(self, connector, reason):
#如果连不上就会调用该方法,也是reactor中自动调用的
print "Connection failed - goodbye"
reactor.stop() def clientConnectionLost(self, connector, reason):
#如果连的过程中断开了,就会自动执行该方法,也是reactor方法自动调用的
print "Connection lost - goodbye"
reactor.stop() def main():
f = EehoFactory()
#创建一个客户端的基类
reactor.connectTCP("localhost",9000,f)
#直接连接 if __name__ == '__main__':
main()
使用twised实现一个EchoServer的更多相关文章
- 如何在多线程leader-follower模式下正确的使用boost::asio。
#include <assert.h> #include <signal.h> #include <unistd.h> #include <iostream& ...
- I/O多路复用
为什么要使用I/O多路复用 假设要求你写一个echo-server服务器,它也能对用户从标准输入键入的交互命令做出响应.在这种情况下, 服务器必须响应两个互相独立的I/O事件: 1) 网络客户端发起的 ...
- ACE的Socket初步
Tcp通信过程一般为如下步骤: 服务器绑定端口,等待客户端连接. 客户端通过服务器的ip和服务器绑定的端口连接服务器. 服务器和客户端通过网络建立一条数据通路,通过这条数据通路进行数据交互. 常用AP ...
- Akka边学边写(2)-- Echo Server
EchoServer 上篇文章里,我们用Akka写了一个简单的HelloWorld样例,对Akka(以及Actor模式)有了初步的认识.本文将用Akka写一个EchoServer,看看在Actor的世 ...
- IO多路复用深入浅出
前言 从零单排高性能问题,这次轮到异步通信了.这个领域入门有点难,需要了解UNIX五种IO模型和 TCP协议,熟练使用三大异步通信框架:Netty.NodeJS.Tornado.目前所有标榜异步的通信 ...
- python 浅析IO 模型
协程:遇到IO操作就切换,但是什么时候切回去呢?怎么确定IO操作? 很多程序员可能会考虑使用"线程池"或"连接池"."线程池"旨在减少创建和 ...
- Netty3:分隔符和定长解码器
回顾TCP粘包/拆包问题解决方案 上文详细说了TCP粘包/拆包问题产生的原因及解决方式,并以LineBasedFrameDecoder为例演示了粘包/拆包问题的实际解决方案,本文再介绍两种粘包/拆包问 ...
- 网络编程基础【day10】:IO多路复用
这些名词比较绕口,理解涵义就好.一个epoll场景:一个酒吧服务员(一个线程),前面趴了一群醉汉,突然一个吼一声“倒酒”(事件),你小跑过去给他倒一杯,然后随他去吧,突然又一个要倒酒,你又过去倒上,就 ...
- ACE前摄器Proactor模式
转载于:http://www.cnblogs.com/TianFang/archive/2006/12/31/608952.html 当 OS 平台支持异步操作时,一种高效而方便的实现高性能 Web ...
随机推荐
- Sublime Text关闭自动更新
这几天体验了一下传说中的Sublime Text,感觉确实很好用.不过有一点很不爽,每次打开都会自动检测更新,于是Google了一把发现关闭它其实很容易, “首选项”——“设置--用户”,在里面写上& ...
- linux 模拟生成 CAN 设备
/************************************************************************************** * linux 模拟生成 ...
- LOJ10131. 「一本通 4.4 例 2」暗的连锁【树上差分】
LINK solution 很简单的题 你就考虑实际上是对每一个边求出两端节点分别在两个子树里面的附加边的数量 然后这个值是0第二次随便切有m种方案,如果这个值是1第二次只有一种方案 如果这个值是2或 ...
- 注册dll文件
1.打开"开始-运行-输入regsvr32 XXX.dll",回车即可 2.win7 64位旗舰版系统运行regsvr32.exe提示版本不兼容 在运行regsvr32.exe的时 ...
- hibernate框架的核心对象和相关知识点
Hibernate架构下图提供了hibernate体系的高层视图: Hibernate全面解决方案: Hibernate核心APIConfiguration负责管理数据库的配置信息.数据库的配置信息包 ...
- Programming Languages: Application and Interpretation
http://cs.brown.edu/courses/cs173/2012/book/ 1 Introduction 1.1 Our Philosophy 1.2 The Structure of ...
- thinkpad t420安装debian需要注意的细节
关闭双显卡,使用集成显卡,32位可以用独显跑起来,但是64位的wheezy只能兼容集成显卡,不知道为啥,否则会在某些usb插入/或者拔出来以后,重启提示 failed to execute /lib/ ...
- vagrant 相关记录
最近安装vagrant 出错的最大的可能性是BOX 路径不太对, 好像和目录的大小写有关系,请检查 $ vagrant init # 初始化$ vagrant up # 启动虚拟机$ vagrant ...
- 峰Spring4学习(6)spring AOP的应用例子
一.AOP简介: 二.AOP实例: 三.使用的例子 需求:在student添加的前后,打印日志信息: 0)spring AOP需要引用的jar包: 1)StudentService.java接口: p ...
- Bootstrap-Plugin:过渡效果(Transition)插件
ylbtech-Bootstrap-Plugin:过渡效果(Transition)插件 1.返回顶部 1. Bootstrap 过渡效果(Transition)插件 过渡效果(Transition)插 ...