“夏雨。”唐欣答道,随即身形微微闪开,将背后那羞红着脸的夏雨露了出来。

朱允?尚睦镉幸饬址缌毂??皇且坏悖?绻?址缟??鹘??辖??⒈?幕褂心切┚?薪?焓欠窕岱??飧鍪焙蛞丫?辉市碛腥魏紊潦В?暇姑娑缘氖切撞械难嗤醣本?

德友圈作弊器透视ios

“回皇上,皇太孙每天天不亮就起来,那些堆积如山的奏折,看着都让人脑袋疼。”
宁荣荣的九宝琉璃塔光芒绽放,一瞬间就给马红俊施加了攻击增幅,给小舞施加了敏捷增幅。

“你可以这么理解,不过现在我也算是客人一个,老板娘你用这样的语气我可以理解为你是在赶客人,或者说我是众多客人里面让你看我不爽的一个。”刘皓暗赞一声,不愧是马叮当,冷静从容,自信,骄傲,这种骄傲并不是形容人骄傲的贬义词,用来形容马叮当则是变成了褒义。

Nodejs的运行原理-函数回调篇


前言

当客户端向http server 发起TCP链接时,server端会发起一系列的callback调用,这是一个逆向调用的过程;开始于libuv,终止于js代码里的callback(promise then)函数。

如下图所示,http server 正向调用过程,实际大部分的时间花在net.js上,直到最下面的红框,才调用了关键函数createTCP()

function createTCP() {
   //绑定tcp_wrap模块,调用tcp constructor。   
    var TCP = process.binding("tcp_wrap").TCP;
    return new TCP();
}

 

 

tcp_wrap模块

我们看一下tcpwrap::initialize()的代码:

          void TCPWrap::Initialize(Handle<Object> target, Handle<Value> unused, Handle<Context> context) {
	  Environment* env = Environment::GetCurrent(context);
	
	  Local<FunctionTemplate> t = FunctionTemplate::New(env->isolate(), New);
	  t->SetClassName(FIXED_ONE_BYTE_STRING(env->isolate(), "TCP"));
	  t->InstanceTemplate()->SetInternalFieldCount(1);
	  // Init properties
	  t->InstanceTemplate()->Set(String::NewFromUtf8(env->isolate(), "reading"),Boolean::New(env->isolate(), false));
	  t->InstanceTemplate()->Set(String::NewFromUtf8(env->isolate(), "owner"),Null(env->isolate()));
	  t->InstanceTemplate()->Set(String::NewFromUtf8(env->isolate(), "onread"),Null(env->isolate()));
	  t->InstanceTemplate()->Set(String::NewFromUtf8(env->isolate(),"onconnection"),Null(env->isolate()));
	
	  NODE_SET_PROTOTYPE_METHOD(t, "open", Open);
	  NODE_SET_PROTOTYPE_METHOD(t, "bind", Bind);
	  NODE_SET_PROTOTYPE_METHOD(t, "listen", Listen);
	  NODE_SET_PROTOTYPE_METHOD(t, "getsockname", GetSockName);
	
	  target->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "TCP"), t->GetFunction());
	  }
	
	NODE_MODULE_CONTEXT_AWARE_BUILTIN(tcp_wrap, node::TCPWrap::Initialize)

 利用v8 engine的 functionTemplate 创建一个js类。

类的constructor 是 TCP(),

类的prototype是NODE_SET_PROTOTYPE_METHOD()

类的属性是t->InstanceTemplate()->Set().

在执行函数createTCP()调用process.binding("tcp_wrap")时,其实会调用到下图。在红框内,可以看到参数target被设置成了export对象,也就是说,tcp_wrap模块真正导出的是TCP函数

Server.prototype._listen2

结合上图,我们可以看到函数_listen2中调用createServerHandle() 返回了一个_handle对象,并且self._handle.onconnection = onconnection,这一步也非常重要。

AsyncWrap准备工作

AsyncWrap 和Env的代码截图:

准备工作及流程:

callBack的逆向调用

前面都是铺垫,这里才是正题。

正向调用过程,从createServer()开始,到listen()结束,为了创建一个基于TCP的http server。了解socket流程的都知道,到此为止,创建工作实际已经完成,剩下的就是等待客户connect。

而所有的callback执行的目的是对应用程序构造出一个socket的对象,并且基于此对象完成面向连接的数据流读取操作。

下图为调用流程:

 

First callback

TCP::Listen()通过libuv提供的uv_listen()实现了listen异步调用,并且指定了callback回调函数TCPWrap::OnConnection()。

OnConnection()由libuv的event loop调用。

在看Nodejs Env.h 和 Env-inl.h 中可找到PER_ISOLATE_STRING_PROPERTIES(v)若干引用,就像上面图所示,env->onconnection_string()会返回symbole onconnection

MakeCall中,通过object()->Get()获取symbole的对应函数。

Other callback

net.js中的onconnection()会被调用,如下图所示:

两个要点,一是创建了socket对象,二是发出了connection时间。

开发者调用createServer()时,其实是在执行new Server(),而类Server中对connection之间有一个监听者,那就是connectionListener(),也就是第三个callback。

通过前文,我想后面的事情就不在赘述了。

 

当前文章:http://hnhdqp.com/list2018101346156/

发布时间:2019-02-18 01:16:44

扑克镜像翻牌小游戏 棋牌游戏大厅港式五张 欢乐麻将最新版下载 polo论坛 微信一元牛牛群贴吧 2019香港历史开奖结果 安卓版大字扑克翻牌机 3a棋牌下载

编辑:伯伯丁

相关新闻

空气能技术驶入E+蓝钻时代 美的战略调整再创行业标杆

2019-02-18 00:10:35

陇南凑虏租售有限公司

铁塔公司组建详情公布:8名董事7名兼任

2019-02-18 00:06:38

南充以自电子商务有限公司

中国移动与苏宁达成战略合作 建设4G体验区

2019-02-18 01:44:09

漯河杆概谷科技有限公司

国务院:9月1日起免征新能源汽车购置税

2019-02-18 00:50:06

延边桨炮装饰工程有限公司

热门推荐

  • 北京多城区举办专场招聘会 外来务工人员因疏解失业可获补贴
  • 360手机李开新:明年业绩增长超50%,未来出货超1000万
  • 百度圣卡新福利:可添加3个亲情号码,通话免费
  • 高通正式推出骁龙700系列移动平台!
  • 保姆纵火案终判死刑,律师:理解保姆上诉,也确信二审维持原判
  • 인천, 전지훈련 일정 확정…태국·중국서 담금질
  • 伊朗总统鲁哈尼:沙特满足两个条件 伊朗可与其复交
  • 送精华露/第二件半价,妮维雅男士抗痘控油洗面奶150ml装19.98元
  • 安卓8.0最新占有率出炉:仅为0.3%
  • 与都会对话,探讨都会的精神
  • 河北新闻网版权所有 本站点信息未经允许不得复制或镜像 法律顾问:官方炸金花提现游戏 全民斗地主4399·
  • 新开街机捕鱼平台送分 copyright ? 2000 - 2016
  • 新闻热线:0311-67563366 广告热线:0311-67562966 新闻投诉:0311-67562994
  • 冀ICP备 09047539号-1 | 互联网新闻信息服务许可证编号:1312006002
  • 广播电视节目制作经营许可证(冀)字第101号|信息网络传播视听节目许可证0311618号
  • 好友房 在中至游戏打牌私下人民币结算 炸金花下载大全 买麻将机遥控器多少钱