- 浏览: 543039 次
- 性别:
- 来自: 北京-郑州
文章分类
最新评论
-
痛苦不忧伤:
非常简单清晰
java向上转型 -
fusionyu:
IndexWriter没有正常关闭,导致索引循环能修复不?怎么 ...
关于搜索开发过程中的总结 -
yong7356:
学习一下。。。。。。。
eclipse打jar包 -
Zengchen2:
讲得很实用
内部类使用场景二:实现回调函数 -
sun19890214:
mark下,一些能看懂,一些看不懂
关于搜索开发过程中的总结
reactor.ConnectTCP(host,port,xxfactory)
ConnectTCP这个方法在twisted.internet.posixbase.py当中
方法源码如下:
def connectTCP(self, host, port, factory, timeout=30, bindAddress=None): """@see: twisted.internet.interfaces.IReactorTCP.connectTCP """ c = tcp.Connector(host, port, factory, timeout, bindAddress, self) c.connect() return c
代码只有关键的两句:
c = tcp.Connector(host, port, factory, timeout, bindAddress, self) c.connect()
下面开始解读:
1、源码位于/twisted/internet/tcp.py
c = tcp.Connector(host, port, factory, timeout, bindAddress, self)
通过一步步的跟踪,可以找出本行代码执行了tcp.Connector的初始化方法:
def __init__(self, host, port, factory, timeout, bindAddress, reactor=None): self.host = host if isinstance(port, types.StringTypes): try: port = socket.getservbyname(port, 'tcp') except socket.error, e: raise error.ServiceNameUnknownError(string="%s (%r)" % (e, port)) self.port = port self.bindAddress = bindAddress base.BaseConnector.__init__(self, factory, timeout, reactor)
最后这句代码调用了/twisted/internet/base.py当中的BaseConnector的初始化方法:
def __init__(self, factory, timeout, reactor): self.state = "disconnected" self.reactor = reactor self.factory = factory self.timeout = timeout
这样就非常清晰了,c = tcp.Connector(host, port, factory, timeout, bindAddress, self)主要做了外部环境的初始化工作。
2、源码位于/twisted/internet/base.py
c.connect()
/twisted/internet/tcp.py当中的class Connector(base.BaseConnector)继承自base.BaseConnector,c.connect()这个方法就是base.BaseConnector当中的方法。下面看看这个方法的内容:
def connect(self): """Start connection to remote server.""" .................. .................. self.state = "connecting" if not self.factoryStarted: self.factory.doStart() self.factoryStarted = 1 self.transport = transport = self._makeTransport() ........... ...........
这个方法主要做了两件事情:
一是启动工厂
二是建立socket连接,同时建立protocal处理成功的连接
2.1、联系上下文,知道self.factory.doStart()方法会被执行,这个方法当中包含了twisted.internet.protocal
当中的def startFactory(self)这个方法的描述为:
"""This will be called before I begin listening on a Port or Connector.
It will only be called once, even if the factory is connected
to multiple ports.
This can be used to perform 'unserialization' tasks that
are best put off until things are actually running, such
as connecting to a database, opening files, etcetera.
"""
2.2、下面就是执行self.transport = transport = self._makeTransport()
_makeTransport()方法包含在/twisted/internet/tcp.py当中的Connector类中:
def _makeTransport(self): return Client(self.host, self.port, self.bindAddress, self, self.reactor)
再去找到Client类,也位于/twisted/internet/tcp.py当中:初始化方法:
def __init__(self, host, port, bindAddress, connector, reactor=None): ............. ............. whenDone = self.resolveAddress .............. .............. self._finishInit(whenDone, skt, err, reactor)
分析这个方法:self.resolveAddress:
def resolveAddress(self): if abstract.isIPAddress(self.addr[0]): self._setRealAddress(self.addr[0]) ................. ................ def _setRealAddress(self, address): self.realAddress = (address, self.addr[1]) self.doConnect()
最终会找到doConnect方法,在这个方法当中,完成了socket的连接,然后完成protocal的创建;然后开始等待数据。
针对socket连接的部分就不具体描述了,doConnect方法的上半部分就是处理socket连接的。
doConnect()方法的最后一句代码是调用了_connectDone方法,这个方法当中主要完成了协议的创建--protocal的创建,大家可以顺着看一下protocal是如何创建的:
def _connectDone(self): self.protocol = self.connector.buildProtocol(self.getPeer()) self.connected = 1 self.logstr = self.protocol.__class__.__name__ + ",client" self.startReading() self.protocol.makeConnection(self) def buildProtocol(self, addr): """Create an instance of a subclass of Protocol. The returned instance will handle input on an incoming server connection, and an attribute \"factory\" pointing to the creating factory. Override this method to alter how Protocol instances get created. @param addr: an object implementing L{twisted.internet.interfaces.IAddress} """ p = self.protocol() p.factory = self return p def makeConnection(self, transport): """Make a connection to a transport and a server. This sets the 'transport' attribute of this Protocol, and calls the connectionMade() callback. """ self.connected = 1 self.transport = transport self.connectionMade() def connectionMade(self): """Called when a connection is made. This may be considered the initializer of the protocol, because it is called when the connection is completed. For clients, this is called once the connection to the server has been established; for servers, this is called after an accept() call stops blocking and a socket has been received. If you need to send any greeting or initial message, do it here. """
说实在话,源码是能看懂的,但是机制也就是内幕的原理还不是很明白的。但就目前来看当创建了一个socket连接的同时,会创建这个连接的协议,连接和协议应该是一对一的关系,而工厂却可以放置管理多个协议。
学习需要实践,需要融汇贯通,这都需要时间,也许在下面的项目中,等自己顿悟之后,还可以回来再好好说说。
发表评论
-
python下innodb的数据提交问题
2010-07-12 18:00 1946mysql数据库存储引擎从isam转移到了innodb 今天 ... -
Python解释执行原理
2010-04-21 11:00 7469谈到了Python语句的两种 ... -
python基础补习
2010-04-21 10:55 1567Python是一种解释性的 ... -
dbutils安装笔记以及mysql数据库操作问题
2010-04-02 11:05 4739dbutils安装笔记; tar -zxvf DBUt ... -
twisted单线程多任务
2010-04-02 10:10 2921关于单线程多任务刚 ... -
python 多线程 gil
2010-03-16 19:01 3199python里的多线程是单cpu ... -
dbutils,sqlobject,SQLAlchemy
2009-08-22 18:26 3473Python DBUtils 提供了稳固的、持久的到数据库的连 ... -
os.open当中的读写选项
2009-07-22 15:40 19871、读文件 读文本文件 input = open('dat ... -
JE API 闲聊实现
2009-06-12 18:29 1579注意:用到json-python进行json字符串的解析,需要 ... -
httplib,urllib和urllib2的了解学习
2009-06-12 15:30 9659httplib — HTTP protocol client: ... -
struct的pack和unpack方法
2009-06-03 23:55 18653这两天做TCP协议,数据 ... -
针对twisted--Defered的单线程多任务的理解
2009-06-03 23:13 2741从网上找了不少关于twis ... -
twisted异步机制--Deferred
2009-06-03 14:44 9154Deferred:提供了让程序查 ... -
Twisted基本模型
2009-06-03 14:27 5459一、Twisted基本模型Twisted 网络编程框架是一种基 ... -
并发编程的概念知识以及twisted的引出
2009-06-03 10:27 1675并发编程介绍:要完成某些计算任务经常需要不少时间,其原因有两点 ... -
使用wxPython实现mail的简单客户端
2009-05-22 15:22 2198本程序的目的是:结合当前所学习的wxPython的理论知识,同 ... -
wxPython的Core组件--其他sizer
2009-05-14 22:42 14501、WX.GridSizer: wx.GridSizer(i ... -
wxPython的Core组件--BoxSizer
2009-05-13 12:32 4724wx.BoxSizer: box = wx.BoxSiz ... -
wxPython的Controls组件学习1----Menus and Toolbars
2009-05-11 23:54 1817To implement a menubar in wxPyt ... -
wxPython的windows构件的具体学习
2009-05-10 16:50 1958按照前面的总结思路 ...
相关推荐
reactor-netty, TCP/HTTP/UDP 客户机/服务器,带有联网的反应器 反应器联网 http://projectreactor.io/docs/netty/release/api/在软件许可证 2.0许可,,,。
Eziriz.Net.Reactor.4.9.7.0.rar 破解版
Eziriz.Net.Reactor.Cracked(最新版附带操作流程图),最新版,本人亲测有效,exe代码程序成功混淆
Reactor.js 是一个基于 JavaScript 的轻量级响应式编程库,旨在提供一种高效且灵活的方式来处理数据流和事件。在这个深入解析中,我们将探讨 Reactor.js 的核心概念、设计模式以及如何在实际项目中应用它。 ### 一...
.NET Reactor [5.9.2.0] - 2018年9月12日 ------------------------------------- 重建保护引擎以支持更多框架 添加了NET Core保护支持 添加了NET Standard 1.6 / 2.0保护支持 为MAC OSX(Eto.Forms)保护支持添加了...
Eziriz.Net.Reactor.v4.9.0.0.Cracked.by.yoza[UpK] Software name : .Net.Reactor Version : 4.9.0.0 Last Update : 5 June 2014 - 7:18 AM OS : WinALL Developers : Eziriz Web-site : ...
源码分析可以帮助开发者学习如何构建反应式系统,掌握反应堆核心组件的设计思想和实现细节。 开源项目的特性使得Reactor Core能够持续改进,社区成员可以通过参与讨论、提交bug报告或提供代码贡献来推动项目发展。...
reactor.on($("parse"), new Consumer<Event<String>>() { public void call(Event ev) { service.handleEvent(ev); } }); // Send an event to this Reactor and trigger all actions //...
.NET Reactor是一款方便易用的.net混淆器。该软件安全可靠、简单易用,主要用来帮助开发人员保护他们的 .NET 软件产品. 在破解者和您的 .NET 代码之间构建了强大的防破解保护.
Eziriz.NET.Reactor.v5.9.8.0.Cracked win10亲测可用win10亲测可用
Eziriz.NET.Reactor.v4.8.0.0。
Eziriz.Net.Reactor.v4.9.0.0.Cracked.by.yoza
Net.Reactor.4.9.7.0加密混淆工具。
.NET Reactor 5.0.0.0破解版 亲测可用
Software name : .Net.Reactor Version : 4.9.0.0 Last Update : 5 June 2014 -...Crack/dotNET_Reactor.exe MD5: 2E0B3706B2723E399CCCA9ABB4B79200 SHA1: 3685D7BD1D9120B6BC37A1386A63AE49CC61EF2D CRC32: 0E8D3D9E
Eziriz.Net.Reactor.v4.9.0.0
Eziriz.Net.Reactor.v4.9.7.0.Cracked.by.yoza.rar 亲测可用
Eziriz.NET.Reactor.v4.6.0.0破解版!
3) 使用Crack文件夹下的破解版替换安装目录下的"dotNET_Reactor.exe"(默认安装目录:C:\Program Files (x86)\Eziriz\.NET Reactor). 4) 运行程序,就可以使用Eziriz.Net.Reactor.v4.9的全部功能了.