




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
看看node.js chat程序如何实现Ajax long-polling长链接刷新模式 前言首先,关于node.js,这里就不再细说了。node.js chat是node.js作者用JS写的一个多人聊天工具, 源代码公开下载,网址是。作者用这个小例子,来展示如何用nodejs开发高效率的应用程序。对于nodejs的学习者来说,是一个很好的例子。废话不多说,开始今天的主题。纵观这个程序,感觉它的最可贵之处,在于展示了,如何用nodejs实现长链接模式的刷新技术。(这个程序不详细介绍,重点讲解这个功能)Client.js首先看一段核心代码: 1 function longPoll (data) 2 3 /.此处省略行 4 5 $.ajax( cache: false 6 , type: GET 7 , url: /recv 8 , dataType: json 9 , data: since: CONFIG.last_message_time, id: CONFIG.id 10 , error: function () 11 addMessage(, long poll error. trying again., new Date(), error);12 transmission_errors += 1;13 /dont flood the servers on error, wait 10 seconds before retrying14 setTimeout(longPoll, 10*1000);15 16 , success: function (data) 17 transmission_errors = 0;18 /if everything went well, begin another request immediately19 /the server will take a long time to respond20 /how long? well, it will wait until there is another message21 /and then it will return it to us and close the connection.22 /since the connection is closed when we get data, we longPoll again23 longPoll(data);24 25 );26 这是client.js中的一段代码,一看这段代码,大家应该立马想到两个字“递归”。在longPoll方法中,再次调用longPoll方法,典型的递归调用。根据这段代码的语义,可以看出,第一次加载时,会调用longPoll方法,异步向/resv获取值,如果成功了, 执行success的方法,立即再次调用longPoll方法。如果失败了,执行error函数,隔10秒中再次调用longPoll方法。当然,执行error方法有一定的次数限制,由变量transmission_errorsx控制。大家可能会有一个疑问,这样一直递归循环获取数据,服务器会不会有很大的负担?在没有数据可获取的时候,也会一直这样循环吗?当然,答案时否定的!并且,nodejs利用自身的特点,很好的处理了这个问题。接着往下看:Server.js现看server中如何回应上面client的调用,核心代码:1 fu.get(/recv, function (req, res) 2 3 /对session的验证和更新. 4 5 channel.query(since, function (messages) 6 if (session) session.poke();7 res.simpleJSON(200, messages: messages, rss: mem.rss );8 );9 );先不要管这个fu.get()是什么意思,它和本次教程无关。总之知道它能回应client的调用就行了。上面的代码,除了对session的一些操作之外,只是调用了channel的query方法。注意传递的参数: since,它纪录了一个时间; 匿名方法,它接受一个messages参数,两个动作:1 更新session时间,2 返回一个json,即把messages返回给客户端。 有人可能会有疑问:在这里直接返回messages不行吗,干嘛还得在一个channel中定义一个方法才操作?答案:如果是那样,就成了一个死循环,server和client每时每刻都进行着数据交互,即使没有信息可返回。还是接着往下看吧!看channel是怎么定义的:var MESSAGE_BACKLOG = 200, SESSION_TIMEOUT = 60 * 1000;var channel = new function () var messages = , callbacks = ; this.appendMessage = function (nick, type, text) var m = nick: nick , type: type / msg, join, part , text: text , timestamp: (new Date().getTime() ; switch (type) case msg: sys.puts( + text); break; case join: sys.puts(nick + join); break; case part: sys.puts(nick + part); break; messages.push( m ); while (callbacks.length 0) /shift() 方法用于把数组的第一个元素从其中删除,并返回第一个元素的值 callbacks.shift().callback(m); while (messages.length MESSAGE_BACKLOG) messages.shift(); ; this.query = function (since, callback) var matching = ; for (var i = 0; i since) matching.push(message) if (matching.length != 0) callback(matching); else callbacks.push( timestamp: new Date(), callback: callback ); ; / clear old callbacks / they can hang around for at most 30 seconds. setInterval(function () var now = new Date(); while (callbacks.length 0 & now - callbacks0.timestamp 30*1000) callbacks.shift().callback(); , 3000);channel中定义了两个变量,两个方法,还有一个每隔3秒执行一次的setInterval函数。首先看query方法,query方法接收两个参数: since:纪录一个时间 callback:即上面讲调用channel.query方法时传入的那个匿名函数(JS中,函数可以当参数传递,接收之后可直接调用。不会赶快补课啊。) messages里存的时当前的聊天纪录队列,query方法会查找符合条件的聊天纪录,把他们放在matching队列中。如果matching.length0,则调用callback接收的函数,即把matching以json格式返回client。但是。接下来是重点!if (matching.length != 0) callback(matching); else callbacks.push( timestamp: new Date(), callback: callback );如果matching.length 0) /shift() 方法用于把数组的第一个元素从其中删除,并返回第一个元素的值 callbacks.shift().callback(m);现在要判断callbacks有没有储存,如果有,就执行一个,删除一个,知道执行完了为止。因为之前在没有聊天消息可返回的时候,有人发出了请求,然后系统没有执行这些请求,都把他们放在callbacks列表中了。现在有人发送了聊天消息,执行添加方法的时候,要再次把那些没执行的请求都执行一遍。通俗理解可
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工作中的有效沟通与合作能力培养
- 工作中的时间管理艺术与实践经验分享
- 工作场所心理健康关怀
- 工业领域中的热管理新材料探索
- 工程制造中的精确测量与数学计算
- 工作流程优化中的设备管理关键点
- 工厂教育培训提升员工技能的新途径
- 工程机械的远程监控和故障诊断技术应用
- 工厂电气节能改造的案例分析
- 工程机械的保养与维修技巧
- 胆石症中西医结合诊疗专家共识(2025年)解读课件
- 《桥梁下部结构》课件
- 《静脉通道建立与维护:留置针穿刺及护理》课件
- 成人机械通气患者俯卧位护理课件
- 四川省内江市市中区2025年小数毕业模拟试卷(含答案)
- 《中国传统节庆文化》课件
- 公路养护基础知识
- 3-6岁儿童学习与发展指南-语言
- 医学知识 避雷器带电检测方法与异常诊断 学习课件
- 养老护理员知识培训课件
- 2025-2030中国袋式除尘器市场需求前景与发展动向追踪研究报告
评论
0/150
提交评论