使用twised实现一个EchoServer

ProtocolsProtocols描述了如何以异步的方式处理网络中断时间,HTTP、DNS已经IMAP是应用应用层协议中的例子,Protocols实现了IProtocol接口,它饱和如下的方法

makeConnection              在transport对象和服务器之间建立一条连接connectionMade              连接建立起来后调用dataReceived                接受数据的时候调用connectionLost              关闭连接时候调用

Transports代表2个节点之间的通信,负责描述连接是细节,Transports实现了ITtansports接口,它包含如下的方法

write                以非阻塞的方式按顺序依次将数据写到物理连接上,如果遇到阻塞会立刻切换writeSequence        将一个字符串列表写到物理连接上,把列表中的每个元素以一个一个写过去loseConnection       将所有挂挂起的数据写入,然后关闭连接,即先把未完成的数据传输完成在关闭getPeer              取的连接中对端的地址信息getHost              取得连接中本端的地址信息

先看服务端的代码

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()

  

时间: 2024-08-06 23:58:08

使用twised实现一个EchoServer的相关文章

面向对象之两大要领 (转)

原文: http://cpper.info/2016/01/05/Two-Points-Of-Oriented-Object.html. 总览 在工作初期,我们可能会经常会有这样的感觉,自己的代码接口设计混乱.代码耦合较为严重.一个类的代码过多等等,自己回头看的时候都觉得汗颜.再看那些知名的开源库,它们大多有着整洁的代码.清晰简单的接口.职责单一的类,这个时候我们通常会捶胸顿足而感叹:什么时候老夫才能写出这样的代码! 作为新手,我们写的东西不规范或者说不够清晰的原因是缺乏一些指导原则.我们手中挥

ACE的Socket初步

Tcp通信过程一般为如下步骤: 服务器绑定端口,等待客户端连接. 客户端通过服务器的ip和服务器绑定的端口连接服务器. 服务器和客户端通过网络建立一条数据通路,通过这条数据通路进行数据交互. 常用API: 1. ACE_INET_Addr类. ACE"地址"类ACE_Addr的子类,表示TCP/IP和UDP/IP的地址.它通常包含机器的ip和端口信息,通过它可以定位到所通信的进程. 定义方式: ACE_INET_Addr addInfo(3000,"192.168.1.100

Tornado demo3 - tcpecho分析

在这个demo中,主要是使用了Tornado中异步的TCP client和server来实现一个简单的echo效果(即客户端发送的message会从server端返回到client).代码的github链接点这里. 1 Server端代码分析 1 import logging 2 from tornado.ioloop import IOLoop 3 from tornado import gen 4 from tornado.iostream import StreamClosedError

IO多路复用深入浅出

前言 从零单排高性能问题,这次轮到异步通信了.这个领域入门有点难,需要了解UNIX五种IO模型和 TCP协议,熟练使用三大异步通信框架:Netty.NodeJS.Tornado.目前所有标榜异步的通信框架用的都不是异步IO模型,而是IO多路复 用中的epoll.因为Python提供了对Linux内核API的友好封装,所以我选择Python来学习IO多路复用. IO多路复用 select 举一个EchoServer的例子,客户端发送任何内容,服务端会原模原样返回. #!/usr/bin/env p

Akka学习笔记(2)-- Echo Server

EchoServer 上篇文章里,我们用Akka写了一个简单的HelloWorld例子,对Akka(以及Actor模式)有了初步的认识.本文将用Akka写一个EchoServer,看看在Actor的世界里,如何使用TCP协议. Github项目 照例,EchoServer的代码被放在了Github上.EchoServer比HelloWorld稍微复杂一点,一共有三个类,如下图所示: Main 这次先从主类入手: main()方法的第一行创建了一个Actor系统,名字为mySystem.接下来的四

Akka边学边写(1)-- Hello, World!

Akka Akka是什么呢?直接引用Akka站点上面的描写叙述吧: Akka is a toolkit and runtime for building highly concurrent, distributed, and fault tolerant event-driven applications on the JVM. 反正我认为Akka是比較难上手的,并且文档对于新手来说,也不太友好.本文会用Akka写一个Hello World程序,从这个程序入手,介绍Akka的一些基本概念. he

Akka学习笔记(1)-- Hello, World!

Akka Akka是什么呢?直接引用Akka网站上面的描述吧: Akka is a toolkit and runtime for building highly concurrent, distributed, and fault tolerant event-driven applications on the JVM. 反正我觉得Akka是比较难上手的,而且文档对于新手来说,也不太友好.本文会用Akka写一个Hello World程序,从这个程序入手,介绍Akka的一些基本概念. hell

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

#include <assert.h> #include <signal.h> #include <unistd.h> #include <iostream> #include <string> #include <deque> #include <set> #include "boost/asio.hpp" #include "boost/thread.hpp" #include

Netty入门二:开发第一个Netty应用程序

    既然是入门,那我们就在这里写一个简单的Demo,客户端发送一个字符串到服务器端,服务器端接收字符串后再发送回客户端. 2.1.配置开发环境 1.安装JDK 2.去官网下载jar包 (或者通过pom构建) 2.2.认识下Netty的Client和Server 一个Netty应用模型,如下图所示,但需要明白一点的是,我们写的Server会自动处理多客户端请求,理论上讲,处理并发的能力决定于我们的系统配置及JDK的极限. Client连接到Server端 建立链接发送/接收数据 Server端