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. ROS会议 ROSCon 2017

    ----ROSCon2012-2017----来源链接:https://roscon.ros.org           近三年ROSCon(2015-2017)都会将会议视频录像和文档公开~以下为机 ...

  2. 20155318 2016-2017-2 《Java程序设计》第八学习总结

    20155318 2016-2017-2 <Java程序设计>第八学习总结 教材学习内容总结 学习目标 了解NIO 会使用Channel.Buffer与NIO2 会使用日志API.国际化 ...

  3. Loj 114 k大异或和

    Loj 114 k大异或和 构造线性基时有所变化.试图构造一个线性基,使得从高到低位走,异或上一个非 \(0\) 的数,总能变大. 构造时让任意两个 \(bas\) 上有值的 \(i,j\) ,满足 ...

  4. Windows 下的高 DPI 应用开发(UWP / WPF / Windows Forms / Win32)

    本文将介绍 Windows 系统中高 DPI 开发的基础知识.由于涉及到坐标转换,这种转换经常发生在计算的不知不觉中:所以无论你使用哪种 Windows 下的 UI 框架进行开发,你都需要了解这些内容 ...

  5. localhost能连接websocket 127.0.0.1 不能连接问题?

    最近开发中遇到一个问题,就是有的浏览器电脑能连接websocket , 有的不能 , 有的能用localhost连接,有的能用127.0.0.1连接,这个问题很奇怪 提供一个很好测试websocket ...

  6. 2018-2019-2 《网络对抗技术》Exp4 恶意代码分析 20165222李勖

    1.系统运行监控 (1)使用如计划任务,每隔一分钟记录自己的电脑有哪些程序在联网,连接的外部IP是哪里.运行一段时间并分析该文件,综述一下分析结果.目标就是找出所有连网的程序,连了哪里,大约干了什么( ...

  7. linux下不同tomcat使用不同的jdk版本

    环境:Linux tomcat7 使用jdk7 tomcat 8使用jdk8 最近写好了一个程序,需要部署在测试机器上,这个测试机器上已经有了在运行的tomcat7, 我这个程序要求使用tomcat8 ...

  8. 在.NET中实现Actor模型的不同方式

    上周,<实现领域驱动设计>(Implementing Domain-Driven Design)一书的作者Vaughn Vernon,发布了Dotsero,这是一个使用C#编写的.基于.N ...

  9. Android Studio使用JDBC远程连接mysql的注意事项(附示例)

    JDBC为java程序访问各种类型的关系型数据库提供了统一的接口,用户不必针对不同数据库写出不同的代码,但是使用JDBC必须得下载相应的驱动,比如我这里是要连接mysql,于是就到mysql官网去下载 ...

  10. 2018-2019-1 20165226《信息安全系统设计基础》 pwd命令的实现

    2018-2019-1 20165226<信息安全系统设计基础> pwd命令的实现 一.学习pwd 查看pwd 得知一个嫩过去文件路径的函数--getcwd i节点值 通过ls -i -a ...