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