使用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 ...
随机推荐
- Git 之 git原理简介
这里只是很简单.超简单的介绍下git,为的是方便记忆: 本地仓库分为三个部分:工作区.暂存区.仓库区,其中暂存区和仓库区属于版本区. 对于文件的操作,需要从工作区----> 暂存区 ----&g ...
- Nginx 反向代理 如何在web应用中获取用户ip
转载:http://blog.csdn.net/bao19901210/article/details/52537279 问题背景: 在实际应用中,我们可能需要获取用户的ip地址,比如做异地登陆的判断 ...
- train validation test
http://stats.stackexchange.com/questions/19048/what-is-the-difference-between-test-set-and-validatio ...
- threejs通过射线Ray获取指定的点
例:获取cube方向上的面的中点坐标(该cube默认方向为(0,1,0)) (中心点向cube quaternion 方向上发射射线,与正前方的面相交的点即为目标点; 由于ray只支持box和face ...
- ECUST 12级 Practise
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=26399#overview 果断开小号水过 CodeForces 58A #include ...
- Visual Studio2010 支持MVC4开发
最近的项目有一个维护的版本使用的是Visual Studio2010+MVC4开发的,记录一下软件的开发环境 ============================================= ...
- ES6必知必会 (八)—— async 函数
async 函数 1.ES2017 标准引入了 async 函数,它是对 Generator 函数的改进 , 我们先看一个读取文件的例子: Generator 写法是这样的 : var fs = re ...
- Loararunner录制脚本
LoadRunner录制 1.启动LoadRunner,用管理员方式打开,选择 “Create/Edit Scripts” 2.从这两个方式任意方式打开脚本页面 3.选择协议,这里我们举例子,用“We ...
- 【转】提高你开发效率的十五个Visual Studio 2010使用技巧
原文网址:http://developer.51cto.com/art/201203/321942.htm 2012-03-06 14:38 Ron Ngai Ron Ngai的博客 字号:T | T ...
- Kafka问题排查(消费者自动关闭)
问题描述: 在消费端能够正常消费到Kafka数据并成功生产到producer topic 中,当将kafka的一台机器关机之后,正常情况下应该是 消费端是不受影响的.因为有还有两 ...