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的更多相关文章

  1. 如何在多线程leader-follower模式下正确的使用boost::asio。

    #include <assert.h> #include <signal.h> #include <unistd.h> #include <iostream& ...

  2. I/O多路复用

    为什么要使用I/O多路复用 假设要求你写一个echo-server服务器,它也能对用户从标准输入键入的交互命令做出响应.在这种情况下, 服务器必须响应两个互相独立的I/O事件: 1) 网络客户端发起的 ...

  3. ACE的Socket初步

    Tcp通信过程一般为如下步骤: 服务器绑定端口,等待客户端连接. 客户端通过服务器的ip和服务器绑定的端口连接服务器. 服务器和客户端通过网络建立一条数据通路,通过这条数据通路进行数据交互. 常用AP ...

  4. Akka边学边写(2)-- Echo Server

    EchoServer 上篇文章里,我们用Akka写了一个简单的HelloWorld样例,对Akka(以及Actor模式)有了初步的认识.本文将用Akka写一个EchoServer,看看在Actor的世 ...

  5. IO多路复用深入浅出

    前言 从零单排高性能问题,这次轮到异步通信了.这个领域入门有点难,需要了解UNIX五种IO模型和 TCP协议,熟练使用三大异步通信框架:Netty.NodeJS.Tornado.目前所有标榜异步的通信 ...

  6. python 浅析IO 模型

    协程:遇到IO操作就切换,但是什么时候切回去呢?怎么确定IO操作? 很多程序员可能会考虑使用"线程池"或"连接池"."线程池"旨在减少创建和 ...

  7. Netty3:分隔符和定长解码器

    回顾TCP粘包/拆包问题解决方案 上文详细说了TCP粘包/拆包问题产生的原因及解决方式,并以LineBasedFrameDecoder为例演示了粘包/拆包问题的实际解决方案,本文再介绍两种粘包/拆包问 ...

  8. 网络编程基础【day10】:IO多路复用

    这些名词比较绕口,理解涵义就好.一个epoll场景:一个酒吧服务员(一个线程),前面趴了一群醉汉,突然一个吼一声“倒酒”(事件),你小跑过去给他倒一杯,然后随他去吧,突然又一个要倒酒,你又过去倒上,就 ...

  9. ACE前摄器Proactor模式

    转载于:http://www.cnblogs.com/TianFang/archive/2006/12/31/608952.html 当 OS 平台支持异步操作时,一种高效而方便的实现高性能 Web ...

随机推荐

  1. python切片取值和下标取值时,超出范围怎么办?

    可迭代对象下标取值超出索引范围,会报错:IndexError 可迭代切片取值超出索引范围,不报错,而是返回对应的空值. a=[1,2,3,4] a[99] Traceback (most recent ...

  2. tar格式 方法安装MySQL后,初次登录出现 ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement

    参考: https://www.cnblogs.com/kerrycode/p/4368312.html http://blog.csdn.net/u014520039/article/details ...

  3. 走在linux 的路上

    终于现在不看鸟哥的私房菜基础篇了,以后再慢慢看,像我这种初学者,感觉还是不太适合看鸟哥的私房菜. 于是从图书馆借了本书继续学习我的linux. 这样看着linux容易多了,进而熟悉了几个命令:ls c ...

  4. Oracle简单的SQL处理

    --单表插入insert into hr.job(job_id,job_title,min_salary) values('IT','Project Manager',50000); insert i ...

  5. json-patch 了解

    What is JSON Patch? JSON Patch is a format for describing changes to a JSON document. It can be used ...

  6. aop学习

    拦截器和过滤器的区别:https://blog.csdn.net/heyeqingquan/article/details/71482169 1,aop是一个编程思想,不是具体的实现,一般有Filte ...

  7. Makefile编写 三 伪目标的作用

    本节我们讨论一个Makefile中的一个重要的特殊目标:伪目标. 伪目标是这样一个目标:它不代表一个真正的文件名,在执行make时可以指定这个目标来执行其所在规则定义的命令,有时我们也可以将一个伪目标 ...

  8. Asp.net MVC 出现“Failed to map the path '/'.”错误

    Server Error in '/' Application. Parser Error Description: An error occurred during the parsing of a ...

  9. WinForm各浏览器内核控件

    WebKit.NET webkit-sharp CefSharp awesomium OpenWebKitSharp geckofx MozNet Web Component

  10. Bootstrap-CL:标签

    ylbtech-Bootstrap-CL:标签 1.返回顶部 1. Bootstrap 标签 本章将讲解 Bootstrap 标签.标签可用于计数.提示或页面上其他的标记显示.使用 class .la ...