精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

使用Node.js搭建最簡單的comet原型

開發(fā) 前端
Comet, 據(jù)IBM這篇文章介紹,是基于HTTP長連接的“服務(wù)器推”技術(shù). 和AJAX類似, 這是一種改善WEB用戶體驗的通訊技術(shù). 其實早在CGI盛行的時代, 有種叫做"Server-Push"的技術(shù), 和Comet本質(zhì)是一回事, 都是基于長連接來實現(xiàn). Server-Push更具體, 強調(diào)使用multipart/x-mixed-replace的Conent-Type技巧, 使得服務(wù)器能替換瀏覽器的內(nèi)容. Comet包含面更廣泛, 只要是有長連接和HTTP chunked的實現(xiàn), 都算作其中. 這篇文章詳細(xì)介紹了Comet的各種形態(tài),值得一讀

什么是Comet

Comet, 據(jù)IBM這篇文章介紹,是基于HTTP長連接的“服務(wù)器推”技術(shù). 和AJAX類似, 這是一種改善WEB用戶體驗的通訊技術(shù). 其實早在CGI盛行的時代, 有種叫做"Server-Push"的技術(shù), 和Comet本質(zhì)是一回事, 都是基于長連接來實現(xiàn). Server-Push更具體, 強調(diào)使用multipart/x-mixed-replace的Conent-Type技巧, 使得服務(wù)器能替換瀏覽器的內(nèi)容. Comet包含面更廣泛, 只要是有長連接和HTTP chunked的實現(xiàn), 都算作其中. 這篇文章詳細(xì)介紹了Comet的各種形態(tài),值得一讀.

51CTO推薦專題:Node.js專區(qū)

Comet雖然能讓瀏覽器達(dá)到及時的響應(yīng), 但是由于基于長連接實現(xiàn), 服務(wù)器成本很高. 最近這種技術(shù)之所以火起來, 主要還是牛人們探索到了各種降低服務(wù)器成本的方法. 這個叫amix的家伙對此有較多的研究.

什么是NodeJs

nodejs號稱Evented I/O for V8 JavaScript, 是基于V8的一款神器, 讓我們可以使用javascript輕松進(jìn)行服務(wù)器端編程.

最簡單的Comet原型

我用一下午的時間, 使用nodejs搞了一個簡單的不能再簡單的Comet原型. 在這個demo里面, 我假定使用iframe實現(xiàn)Comet, 但是忽略了iframe的父窗口和客戶端js庫, 只考慮服務(wù)器如何將HTTP chunked push到客戶端.

我定義了一種Comet資源: http://{host}/{pathname}?[{query_string}] . 其中{pathname}直接當(dāng)作客戶端id來使用(在程序里面它被叫做resid). {query_string}用來做消息內(nèi)容. 這樣, 原型就簡化成了兩種操作:

HTTP GET : http://{host}/{pathname} 用來模擬iframe長連接, 不斷接收到新數(shù)據(jù).

HTTP PUT : http://{host}/{pathname}?{query_string} 用來模擬業(yè)務(wù)操作, 直接將{query_string}當(dāng)作數(shù)據(jù)投遞到上面的長連接里面.

具體實現(xiàn)

好, 主角登場, 用nodejs實現(xiàn)最簡單的Comet:

  1. global.messages = {  
  2.     //'resid':[]  
  3. };  
  4. var char500 = (function(){ var i=0; var arr = []; for(i=0; i<500; i++) { arr.push( ' ' ); } return arr.join(''); })();  
  5. var http_method_funs = {  
  6.     'GET'function(resid, data, request, response) {  
  7.         if(global.messages[resid] == undefined) {  
  8.             global.messages[resid] = [];  
  9.         }  
  10.         response.writeHead(200, {'content-type''text/plain'});  
  11.         var interval = setInterval(myoutput, 500 );  
  12.         response.connection.on('end'function(){  
  13.             console.log("GET\t" + resid + "\tclosed");  
  14.         clearInterval(interval);  
  15.                 });  
  16.         myoutput();  
  17. function myoutput(){  
  18.             var msgs = global.messages[resid];  
  19.             if(msgs.length){  
  20.                 var str = msgs.join("\n\n\n") + "\n\n\n";  
  21.                 str = (str.length < 500 ) ? ( str + char500 ) : str; //for MTU  
  22.             response.write(str);  
  23.                 global.messages[resid] = [];  
  24.  
  25.             }  
  26.     }  
  27.     },  
  28.     'PUT'function(resid, data , request, response) {  
  29.         if(global.messages[resid] == undefined) {  
  30.             global.messages[resid] = [];  
  31.         }  
  32.     global.messages[resid].push(data);  
  33.         console.log(global.messages);  
  34.     response.writeHead(200, {'content-type''text/plain'});  
  35.         response.end( 'ok\n');  
  36.     },  
  37. };  
  38. //method function   
  39. require('http').createServer(function (request, response) {  
  40.         var urlinfo = require('url').parse(request.url);  
  41.         var resid = urlinfo['pathname'];  
  42.         var data = (urlinfo['query']) ? urlinfo['query'] : 0 ;  
  43.         var method = request.method;  
  44.         console.log(method + "\t" + resid );  
  45.         if(typeof http_method_funs[method] == 'function') {  
  46.         http_method_funs[method].call(null, resid, data, request, response);  
  47.         }  
  48.         else {  
  49.             response.writeHead(400);  
  50.         response.end("unsupport method\n");  
  51.  
  52.         }  
  53.         }).listen(18124);  
  54. console.log('server running at http://127.0.0.1:18124/'); 

測試方法

上面的代碼保存到文件, 我們在第一個終端啟動這個服務(wù):

  1. shell> node hello.js 

我們在第二個終端模擬iframe的數(shù)據(jù)流.輸入命令, 觀察收到的數(shù)據(jù):

  1. telnet 127.0.0.1 18124  
  2. GET /mymessages HTTP/1.1  
  3. HTTP/1.1 200 OK  
  4. content-type: text/plain  
  5. Connection: keep-alive  
  6. Transfer-Encoding: chunked 

我們在第三個終端輸入curl -X PUT命令, 模擬發(fā)送兩條消息:

  1. shell> curl -X PUT "http://127.0.0.1:18124/mymessages?a=1&b=2&c=3" 
  2. ok  
  3. shell> curl -X PUT "http://127.0.0.1:18124/mymessages?a=4&b=5&c=6" 
  4. ok 

觀察第二個終端, 會發(fā)現(xiàn)已經(jīng)收到兩條HTTP chunked. (為了避免測試數(shù)據(jù)小于MTU, 我實際上多輸出了一些空格,但這里省去了.)

  1. 202  
  2. a=1&b=2&c=3  
  3. 202  
  4. a=4&b=5&c=6 

總結(jié)

在這個原型中, 我省掉了Comet iframe方案內(nèi)無關(guān)緊要的東西, 只用HTTP PUT/GET來演示一個最簡單的原型. 用NodeJs輕松搭建了它.

可以看到, 用javascript event的風(fēng)格寫服務(wù)器, 簡直是明白如話, 散文那樣自然.

我用global.messages對象來存儲消息, key是resid(上面說的客戶端id), value是個array, 里面存儲客戶端收到的messages.

我為GET/PUT兩種操作分別實現(xiàn)了兩個函數(shù).

PUT函數(shù), 收到請求就將query_string當(dāng)作message存到對應(yīng)resid的array中, 然后斷開HTTP連接.

GET函數(shù), 收到請求就啟動一個定時器, 輪詢global.messages里面自己的消息隊列(array). 如果遇到數(shù)據(jù)則在HTTP response輸出http chunked. HTTP連接不主動關(guān)閉, 但如果被異常關(guān)閉則清除定時器對象.

就這么一個簡單功能, 如果用C和select來開發(fā), 那么一個全局的客戶端句柄隊列是免不了要實現(xiàn)的, 當(dāng)io事件到來時, 如何恢復(fù)之前中斷的上下文,進(jìn)行正確的io操作, 也是一件頭疼的事情.

而我們看這個實現(xiàn)里面的myoutput定時器函數(shù). 由于局部變量resid,response在函數(shù)的定義時環(huán)境內(nèi), 所以函數(shù)被執(zhí)行時, 很自然就使用這些上下文信息. 相比來說, C的實現(xiàn)里面專門為此設(shè)計一個客戶端句柄隊列就太突兀了.

javascript通過函數(shù)式和閉包, 輕而易舉的完成了一個非阻塞服務(wù)器. 如果說libevent是通過庫來實現(xiàn)了事件的封裝, 那么nodejs所宣稱的"Evented I/O for V8 JavaScript", 則是借語言本身的優(yōu)雅特性獲得自然的收獲.

原文:http://club.cnodejs.org/topic/4f16442ccae1f4aa27001115

【編輯推薦】

  1. 什么是Node.js?
  2. Node.js初探之hello world
  3. 揭秘Node.js事件
  4. 走近Node.js的異步代碼設(shè)計
  5. Node.js提速指南
責(zé)任編輯:陳貽新 來源: duzhigang的博客
相關(guān)推薦

2020-03-17 13:24:04

微服務(wù)架構(gòu)數(shù)據(jù)

2023-04-07 09:07:11

2018-08-30 16:08:37

Node.js腳手架工具

2018-06-11 14:39:57

前端腳手架工具node.js

2020-10-12 08:06:28

HTTP 服務(wù)器證書

2022-08-28 16:30:34

Node.jsDocker指令

2013-11-01 09:34:56

Node.js技術(shù)

2023-01-10 14:11:26

2015-03-10 10:59:18

Node.js開發(fā)指南基礎(chǔ)介紹

2021-01-14 10:48:34

Docker CompNode.js開發(fā)

2020-02-25 12:27:59

Node.jsWeb開發(fā)前端

2021-12-25 22:29:57

Node.js 微任務(wù)處理事件循環(huán)

2012-02-03 09:25:39

Node.js

2020-05-29 15:33:28

Node.js框架JavaScript

2021-07-30 11:20:53

JavaScriptNode.jsWeb Develop

2016-08-25 21:28:04

前端node截圖

2022-08-22 07:26:32

Node.js微服務(wù)架構(gòu)

2012-09-29 11:13:15

Node.JS前端開發(fā)Node.js打包

2021-07-16 04:56:03

NodejsAddon

2021-03-03 06:39:05

Nodejs前端開發(fā)
點贊
收藏

51CTO技術(shù)棧公眾號

国产精品日日做人人爱| 日韩高清a**址| 国产精品免费看久久久无码| 国产亲伦免费视频播放| 亚洲午夜91| 亚洲欧洲黄色网| 精品国产乱码久久久久久1区二区| 欧美xxx黑人xxx水蜜桃| 久久久五月婷婷| 91欧美日韩一区| 国产成人综合欧美精品久久| 久久久久亚洲| 精品中文字幕久久久久久| 九九热精品国产| 超碰超碰人人人人精品| 亚洲精品免费播放| 日韩av在线电影观看| 亚洲精品国产精品国| 日本不卡视频在线观看| 久久久久久久久国产| 国产激情av在线| 国内精品国产成人国产三级粉色 | 日韩福利视频在线观看| 亚洲免费黄色录像| 伊人色综合一区二区三区影院视频 | 国产女人18毛片水真多18| 成人日韩av| 欧美日韩一区二区在线播放| 2021狠狠干| av大片在线观看| 久久日韩粉嫩一区二区三区 | av永久不卡| 亚洲国产精久久久久久| 日韩欧美中文在线视频| 国产精品videossex撒尿| 精品久久中文字幕久久av| xxxxxx在线观看| 日本美女高清在线观看免费| 国产色综合一区| 美女视频久久| 午夜在线视频观看| 成人av在线影院| caoporn国产精品免费公开| 一区二区三区精| 老司机免费视频一区二区| 欧洲精品毛片网站| 狠狠躁夜夜躁人人爽天天高潮| 伊人情人综合网| 久久久精品免费视频| 毛片aaaaaa| 日韩美脚连裤袜丝袜在线| 亚洲精品在线观看视频| 国产女主播在线播放| 一区二区在线免费播放| 日韩欧美高清在线| 操人视频免费看| 久久精品免视看国产成人| 欧美男同性恋视频网站| 最新av免费在线观看| 九色成人搞黄网站| 欧美日韩极品在线观看一区| 中文字幕天天干| 久久99国产精品二区高清软件| 欧美日韩中文字幕一区| 久久这里只精品| 91视频成人| 日韩精品综合一本久道在线视频| 一级黄色大片免费看| 超碰精品在线| 日韩乱码在线视频| 日本成人午夜影院| 91精品国产乱码久久久久久| www.久久撸.com| 欧美爱爱小视频| 国产午夜精品一区二区三区欧美| 欧美尤物巨大精品爽| 在线免费观看国产精品| 精品一区二区三区av| 99视频免费观看| 视频一区二区三区国产| 国产日韩欧美在线一区| 中文字幕一区二区三区乱码| 欧美人与性动交α欧美精品济南到 | 国产中文一区二区三区| 都市激情久久久久久久久久久| 污污的视频网站在线观看| 久久久.com| 精品国产一区二区三区在线| 国产中文在线播放| 欧美日韩一级片网站| 久久久精品人妻一区二区三区| 欧美美女黄色| 日韩中文在线观看| 国产精品第九页| 日本aⅴ免费视频一区二区三区| 91色在线观看| 无码国产精品96久久久久| 国产欧美日韩三区| www.一区二区.com| 欧美成人影院| 日韩欧美一区二区久久婷婷| 日本免费福利视频| 91tv精品福利国产在线观看| 欧美一区二区色| 成人黄色在线观看视频| 国产偷国产偷精品高清尤物| 黄色a级片免费看| 成人在线观看免费播放| 亚洲精品一区在线观看| 免费成人美女女在线观看| 亚洲深夜激情| www国产亚洲精品| av基地在线| 疯狂欧美牲乱大交777| 97超碰人人看| 俺要去色综合狠狠| 17婷婷久久www| 精品人妻久久久久一区二区三区 | 亚洲人成网站色ww在线| 国产免费无码一区二区视频| 日韩精品电影在线| 国产一区二区三区四区五区在线| 免费av网站在线看| 91久久精品一区二区二区| 日本wwww色| 91av精品| 国产日韩欧美影视| 国产片在线观看| 欧美视频在线观看免费网址| 日本成人在线免费| 国产精品久久久久无码av| 国产精品久久在线观看| 久久久久久青草| 欧美日韩在线另类| 国产精品麻豆入口| 女人香蕉久久**毛片精品| 成人免费xxxxx在线观看| 风间由美一区| 在线观看日韩电影| 中文字幕成人动漫| 性伦欧美刺激片在线观看| 激情视频在线观看一区二区三区| 97caopor国产在线视频| 欧美高清www午色夜在线视频| 真实乱视频国产免费观看| 亚洲免费网站| 欧美h视频在线| av资源亚洲| 亚洲欧美日韩一区二区在线| www.com国产| 91麻豆精东视频| 毛葺葺老太做受视频| 精品成av人一区二区三区| 国产黑人绿帽在线第一区| 国产精品久久久久一区二区国产 | 欧美亚洲第一页| 视频二区在线| 亚洲成av人片在www色猫咪| 亚洲一区和二区| 亚洲日本国产| 欧美18视频| 国产精品久久久久久吹潮| 色悠悠久久久久| 国产美女永久免费| 一区二区免费看| 91玉足脚交白嫩脚丫| 亚洲视频播放| 日韩精品一线二线三线| 日韩五码电影| 欧美黑人一区二区三区| 五月激情婷婷综合| 91福利国产精品| 最新黄色av网址| 国产ts人妖一区二区| 国产综合av在线| 欧美日韩国产在线观看网站 | ...av二区三区久久精品| 亚洲三级在线视频| 99国产精品久久久久久久成人热| 欧美国产视频在线观看| 国产伊人久久| 欧美激情网站在线观看| 男同在线观看| 91精品欧美福利在线观看| 久草视频精品在线| 中文字幕免费不卡| 亚洲欧美日韩中文字幕在线观看| 国产欧美日韩一区二区三区在线| 人禽交欧美网站免费| 另类视频一区二区三区| 97超级碰在线看视频免费在线看| 大地资源中文在线观看免费版| 欧美一级专区免费大片| 五月天综合激情网| 中文字幕一区不卡| 国产草草浮力影院| 久久99精品久久只有精品| 人妻夜夜添夜夜无码av | 亚洲国产一二三精品无码| 欧美日韩看看2015永久免费 | 免费萌白酱国产一区二区三区| 国产精品成人观看视频国产奇米| av电影高清在线观看| 亚洲欧美在线磁力| 性色av蜜臀av| 欧美日韩国产首页在线观看| www.国产成人| 亚洲久草在线视频| 欧美成人国产精品一区二区| 国产精品亚洲一区二区三区在线 | 国产成人久久精品麻豆二区| 欧美激情欧美狂野欧美精品| av黄色在线观看| 精品亚洲一区二区三区在线播放 | 成人视屏免费看| 天天干天天玩天天操| 国产精品毛片| 欧美狂野激情性xxxx在线观| 99精品国产一区二区三区| 久久综合九色综合久99| 成人春色在线观看免费网站| 成人a在线观看| 123成人网| 国产成人av网| 欧美大胆a人体大胆做受| 欧美另类99xxxxx| 免费人成在线观看播放视频| 亚洲男人av在线| 三级在线播放| 亚洲国产精品电影| 国产夫妻在线观看| 日韩一区二区三区在线| 亚洲一线在线观看| 欧美性猛片aaaaaaa做受| 久久青青草原亚洲av无码麻豆| 亚洲成人黄色影院| 日干夜干天天干| 亚洲精品一二三| 少妇久久久久久被弄高潮| 国产精品久久久久久久岛一牛影视 | 韩国三级日本三级少妇99| 污视频网站在线免费| 久久亚洲精品国产亚洲老地址| 日韩精品黄色| 日韩最新av在线| 黄黄的网站在线观看| 久久精品亚洲94久久精品| 麻豆系列在线观看| 久久久国产一区二区三区| 免费黄色网址在线观看| 日韩在线视频网站| bestiality新另类大全| 久久69精品久久久久久国产越南| 天堂av最新在线| 国内外成人免费激情在线视频| h片精品在线观看| 91精品国产精品| 韩国美女久久| 国产精品久久久久久久久久ktv| 777午夜精品电影免费看| 国产精品一区二区三区久久| 男人天堂久久| 18成人在线| 国产成人福利av| 欧美人xxxxx| 日本久久一二三四| 国产手机视频在线观看| 欧美三级免费| 免费拍拍拍网站| 首页欧美精品中文字幕| 亚洲欧美久久久久| 国产精品 欧美精品| 岛国精品资源网站| 久久精品一级爱片| 日本中文字幕免费在线观看| 亚洲一区二区3| 伊人中文字幕在线观看| 欧美日韩一区精品| 亚洲国产欧美另类| 亚洲精选中文字幕| 黄网页免费在线观看| 国内精品久久久久久影视8| 都市激情亚洲一区| 91色精品视频在线| 色婷婷久久久| 一区二区视频在线播放| 亚洲午夜伦理| 牛夜精品久久久久久久| 国产成人午夜视频| 国产jjizz一区二区三区视频| 成人免费在线观看入口| 久久久久久久黄色片| 欧美日韩免费高清一区色橹橹| 性生活三级视频| 中文字幕亚洲图片| av影院在线免费观看| 国产精品一区二区久久| 欧美理伦片在线播放| 国产一区一区三区| 亚洲欧美日韩国产一区二区| 图片区乱熟图片区亚洲| 久久嫩草精品久久久久| 久久久久性色av无码一区二区| 在线视频一区二区免费| 欧美一区二区三区激情| 日韩一区二区三区在线播放| 午夜影视一区二区三区| **亚洲第一综合导航网站| 第一社区sis001原创亚洲| 欧美大片在线播放| 黑人巨大精品欧美黑白配亚洲| 中文字幕一区二区三区人妻| 亚洲一卡二卡三卡四卡五卡| 一级全黄少妇性色生活片| 亚洲乱码国产乱码精品精| 青春草视频在线| 成人激情视频网| 精品国产乱码久久久久久蜜坠欲下 | 国产精品亚洲综合| 国产精品x453.com| 青青草av网站| 久久综合久久鬼色| 国产午夜激情视频| 欧美一二三区在线| 麻豆传媒免费在线观看| 国产精品久久久久久亚洲调教| 少妇高潮一区二区三区| 久操手机在线视频| 国产精品一二三四| 麻豆视频在线免费看| 精品视频1区2区| 91精彩视频在线观看| 国产精品高潮呻吟久久av无限| 日本天堂一区| 成人免费aaa| 成人动漫一区二区在线| 久久久久久久久99| 欧美mv日韩mv亚洲| 日本小视频在线免费观看| 92福利视频午夜1000合集在线观看| 日韩伦理视频| 国产精品自拍视频在线| 国产精品卡一卡二| 91好色先生tv| 久久夜色撩人精品| 国产精品色婷婷在线观看| 992tv快乐视频| 国产.欧美.日韩| 国产精品99re| 亚洲精品97久久| 亚洲人体视频| 日韩福利二区| 老司机午夜精品| 欧美在线视频第一页| 欧美一区日本一区韩国一区| 97超碰资源站在线观看| 国产精品国产精品国产专区蜜臀ah| 欧美日本一区二区高清播放视频| 国产精品日日摸夜夜爽| 午夜亚洲国产au精品一区二区| 蜜桃视频污在线观看| 91高清免费在线观看| 精品视频免费| 视频免费1区二区三区| 亚洲夂夂婷婷色拍ww47| 人妻少妇一区二区三区| 日韩免费在线免费观看| 久久电影院7| 国产精久久久久| 欧美日韩中文字幕在线| 波多野结衣在线网站| 亚洲aaaaaa| 亚洲经典自拍| 久久久久亚洲AV成人无在| 91精品久久久久久久99蜜桃| 丁香花视频在线观看| 欧美日韩一区二区视频在线| 麻豆中文一区二区| 欧美交换国产一区内射| 亚洲美女精品久久| 欧美黄色a视频| 国精产品一区一区三区视频| 国产日韩成人精品| 99久久国产免费| 欧美中文字幕视频| 91精品国产91久久久久久密臀| 好吊色视频一区二区三区| 91九色最新地址| 国产精品一区hongkong| 日本一区高清在线视频| 国产福利精品一区| 无码一区二区三区| 久久夜色精品国产亚洲aⅴ| 一区二区三区日本久久久| 激情五月婷婷基地| 欧美日韩在线视频观看| 久操视频在线播放| 欧美精品一区二区三区在线看午夜 | 久久精品国产亚洲av麻豆| 3atv一区二区三区|