精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

欧美在线一区视频| 92国产精品视频| 在线免费观看黄色小视频| xx欧美xxx| 国产精品丝袜久久久久久app| 91精品久久久久久久久久久久久| 欧美丰满艳妇bbwbbw| 丝袜美腿一区二区三区动态图| 在线影视一区二区三区| 可以在线看黄的网站| 天天综合在线视频| 久久99蜜桃精品| 97视频com| 久久爱一区二区| 日本亚洲不卡| 91精品国产一区二区三区香蕉 | 欧美国产日韩一区二区| 国产伦精品一区二区三区精品| 免费电影日韩网站| 一区二区三区视频在线看| 欧美日本韩国在线| 亚洲成人77777| 美日韩一级片在线观看| 久久久日本电影| 久久久久久久久久97| 亚洲黄页在线观看| 精品剧情v国产在线观看在线| 亚洲欧美激情网| 狂野欧美性猛交xxxxx视频| 国产色产综合色产在线视频| 国产精品夜夜夜一区二区三区尤| 亚洲无码精品在线播放| 久久精品91| 国产69精品久久久久9| 免费成年人视频在线观看| 狠狠操综合网| 国产午夜精品麻豆| 黄色性视频网站| 精品欧美视频| 欧美福利电影网| 国产嫩草在线观看| 91精品影视| 欧美性xxxx在线播放| 97免费视频观看| av小次郎在线| 亚洲美女屁股眼交| 手机在线视频你懂的| 日本最新在线视频| 中文字幕成人av| 日韩精品极品视频在线观看免费| 青青草娱乐在线| 91捆绑美女网站| 黄色国产精品一区二区三区| 风流老熟女一区二区三区| 国产精品资源在线看| 成人国内精品久久久久一区| 国产精品久久777777换脸| 久色婷婷小香蕉久久| 国产精品久久久久久久久久久久久 | 午夜精品在线播放| 国产一区不卡视频| 91久久爱成人| 亚洲精品911| 成人国产精品免费| 精品无人乱码一区二区三区的优势| 黄色www视频| 99久久精品免费| 久久久久久久久久码影片| 午夜小视频在线播放| 99久久精品情趣| 久久综合中文色婷婷| 国产精品一级伦理| 国产精品免费丝袜| 日韩video| 污视频在线看网站| 精品成人av一区| 国产裸体舞一区二区三区| 99久久婷婷国产综合精品首页 | 天天影视综合色| 国产激情久久| 日韩一级精品视频在线观看| 国产香蕉精品视频| 久久91精品| 色久欧美在线视频观看| 老女人性淫交视频| 国产深夜精品| 国产精品久久久一区| 91女人18毛片水多国产| 丁香六月综合激情| 欧美视频1区| 99视频免费在线观看| 午夜欧美大尺度福利影院在线看 | 激情综合网av| 国产日韩一区二区三区| 不卡在线视频| 一区二区三区在线视频播放 | 精油按摩中文字幕久久| 91九色蝌蚪成人| 手机福利在线| 自拍偷拍国产精品| 免费观看精品视频| 精品一区二区三区中文字幕| 日韩成人av网址| 日本免费网站视频| 国产欧美日韩亚洲一区二区三区| 国产在线观看精品| 日本福利片在线| 亚洲欧美日韩国产手机在线| 国产精品va无码一区二区| 99久久精品一区二区成人| 精品国产三级a在线观看| 五月天精品视频| 亚洲午夜伦理| 91精品久久久久久久久久另类| 欧美一区,二区| 自拍偷在线精品自拍偷无码专区| 日本一本二本在线观看| 99精品中文字幕在线不卡 | a篇片在线观看网站| 色综合久久中文字幕综合网| 亚洲精品一区二区18漫画| 欧美在线色图| 日韩69视频在线观看| 国产综合在线播放| 亚洲三级免费电影| 爱情岛论坛亚洲首页入口章节| 加勒比视频一区| 美女av一区二区三区| 中文天堂在线资源| 久久夜色精品国产欧美乱极品| 国产尤物av一区二区三区| 国产精品第一| 国产亚洲aⅴaaaaaa毛片| 三级黄色在线视频| 播五月开心婷婷综合| 久久久久久久9| 国产精品中文| xxxx性欧美| 一级做a爱片久久毛片| 国产日韩欧美不卡| 日韩无套无码精品| 在线亚洲a色| 欧美最猛性xxxx| 西西人体44www大胆无码| 亚洲国产成人高清精品| 国产欧美视频一区| 欧美日韩国产高清| 99精品99久久久久久宅男| 成人区精品一区二区不卡| 在线播放一区二区三区| 一本一本久久a久久| 裸体在线国模精品偷拍| 亚洲一区二区精品在线| 久久精品资源| 久久精品免费播放| 精品美女www爽爽爽视频| 亚洲乱码国产乱码精品精的特点| 欧美日韩精品区别| 国产精品二区不卡| 91香蕉国产在线观看| а√天堂资源地址在线下载| 日韩一区国产二区欧美三区| 国模无码国产精品视频| 成人h动漫精品一区二| 国产96在线 | 亚洲| 青青草原在线亚洲| 国产精品v日韩精品| 香蕉视频免费在线播放| 91麻豆精品国产91久久久更新时间| 国产精品视频一区二区在线观看| 国产一区二区在线视频| 被灌满精子的波多野结衣| 国产精品nxnn| 人人做人人澡人人爽欧美| 成人影院免费观看| 日韩亚洲欧美成人一区| 久久久久黄色片| 99精品国产视频| 91香蕉视频污版| 亚洲国产不卡| 蜜桃传媒一区二区| 热久久久久久| 久久久久久久久久久人体 | 中文字幕一区日韩电影| 国产精品久久久久久久久久久久久久久久久久| 国产精品久久久久久久久免费桃花 | 全程偷拍露脸中年夫妇| va亚洲va日韩不卡在线观看| 国产综合免费视频| 婷婷综合激情| 狠狠干一区二区| 日韩色性视频| 97在线精品国自产拍中文| av在线免费观看网| 欧美变态tickle挠乳网站| 国产精品一区无码| 亚洲人成影院在线观看| 特级西西人体wwwww| 激情都市一区二区| 欧美视频在线播放一区| 亚洲欧美综合久久久| 欧美成熟毛茸茸复古| 成人黄色理论片| 日本久久精品视频| 国产黄色大片在线观看| 尤物yw午夜国产精品视频| 日本高清视频免费看| 欧美三级在线看| 五月婷婷激情网| 亚洲欧美韩国综合色| 青青草福利视频| 国产.欧美.日韩| 国产色视频在线播放| 在线亚洲自拍| 9191国产视频| 日韩综合在线| 欧美精品一区在线| av日韩在线播放| 亚洲tv在线观看| 国产麻豆一区| 国产成人精品999| 欧美调教sm| 欧美日本中文字幕| 日本激情在线观看| 国产亚洲精品日韩| 亚洲av成人无码久久精品老人| 日韩一区二区三区av| 一级黄色a毛片| 在线亚洲高清视频| 亚洲熟女综合色一区二区三区| 亚洲一区二区三区视频在线播放 | 久久亚洲高清| 日韩电影精品| 国产精品偷伦视频免费观看国产 | 亚洲天堂2024| 麻豆成人av在线| 日韩av卡一卡二| 看电视剧不卡顿的网站| 国内自拍视频网| 日本不卡视频在线| 国产精品69页| 日韩精品一级二级| 无人在线观看的免费高清视频| 羞羞视频在线观看欧美| 欧美激情 国产精品| 亚洲第一精品影视| 久艹视频在线免费观看| 欧美日韩一区二区高清| 国产毛片久久久久久国产毛片| 欧美日本不卡高清| 国产成a人亚洲精v品在线观看| 欧美日韩一卡| 日韩欧美不卡在线| 亚洲欧洲另类| 精品国产一二三四区| 欧美亚洲专区| 别急慢慢来1978如如2| 免费精品视频最新在线| 视频在线观看免费高清| 裸体一区二区三区| 成人在线短视频| 成人一二三区视频| 国产精品无码一区二区三区免费| 久久先锋资源网| 久久久久无码精品国产sm果冻| 国产欧美精品区一区二区三区 | 七七成人影院| 最新热久久免费视频| 男人的天堂av网| 日韩理论片在线| 欧美极品视频在线观看| 亚洲777理论| 亚洲精品男人的天堂| 欧美日韩亚洲国产综合| 99精品在线视频观看| 亚洲成年网站在线观看| 国产污视频在线| 久久影院模特热| 国产无遮挡裸体视频在线观看| 国产精品mp4| 精品一区二区三区中文字幕视频| 国外成人在线视频网站| jiujiure精品视频播放| 久久久久久久久久久久久国产| 黄色日韩在线| 乌克兰美女av| 成人久久久精品乱码一区二区三区| 一本色道综合久久欧美日韩精品 | 99久久99久久精品国产| 午夜视频在线观看一区二区| 中文字幕一区二区三区四区免费看| 91精品国产高清一区二区三区蜜臀| 蜜臀av中文字幕| 中文字幕欧美国内| caoporn-草棚在线视频最| 国产精品91在线| 在线播放一区二区精品视频| 日韩性感在线| 亚洲三级影院| 制服丝袜中文字幕第一页| 99久久久无码国产精品| 波多野结衣喷潮| 日韩欧美视频一区二区三区| 99草在线视频| 亚洲人成电影网站色…| 欧美寡妇性猛交xxx免费| 国产精品久久久| 国内精品偷拍| 青青草原国产免费| 日日夜夜一区二区| 尤物网站在线观看| 综合久久久久综合| 成人一级免费视频| 亚洲黄色片网站| 成人免费高清| 国产精品视频播放| 国产a久久精品一区二区三区| 国产尤物av一区二区三区| 六月丁香综合在线视频| 加勒比综合在线| 狠狠久久五月精品中文字幕| 精品久久久无码中文字幕| 日韩一二三在线视频播| 91伊人久久| 人禽交欧美网站免费| 99riav1国产精品视频| 熟妇女人妻丰满少妇中文字幕| 国产精品午夜电影| 秋霞精品一区二区三区| 亚洲精品国产精品久久清纯直播| 日韩伦理av| 亚洲一区二区中文| 天天综合网91| 中文字幕亚洲影院| 国产精品久久久久久久久果冻传媒| 岛国av中文字幕| 国产婷婷色综合av蜜臀av| 在线观看涩涩| 欧美日韩一区二区视频在线| 99精品热6080yy久久| 色综合久久五月| 亚洲成人免费在线| 人人妻人人澡人人爽人人欧美一区| 欧美韩国理论所午夜片917电影| 亚洲天堂中文字幕在线观看| 中文字幕日韩精品无码内射| 国产一区二区三区久久悠悠色av| 国产免费久久久久| 欧美精品久久久久久久久老牛影院 | 影音成人av| 亚洲免费视频一区| 男女男精品视频| 婷婷国产成人精品视频| 欧美理论片在线| av免费网站在线观看| 91精品天堂| 亚洲国产精品一区制服丝袜| 久久久久久久无码| 色偷偷成人一区二区三区91| 川上优的av在线一区二区| 国产精品一区二区三区成人| 99视频精品全部免费在线视频| 99九九精品视频| 亚洲国产日韩a在线播放| 人妻视频一区二区三区| 欧美性在线观看| av一区二区在线播放| 亚洲第一区第二区第三区| 亚洲一区二区三区国产| 日韩三级电影网| 国产精品狼人色视频一区| 一区二区三区四区在线观看国产日韩| 九九九久久久久久久| 亚洲777理论| 香蕉视频网站在线观看| 成人午夜电影免费在线观看| 99国产精品久久久久久久 | 午夜精品久久久久久久96蜜桃| 久久久日本电影| 精品日韩免费| 国产一级片中文字幕| 午夜精品久久一牛影视| 国产福利第一视频在线播放| 亚洲在线免费视频| 99国内精品| 女人裸体性做爰全过| 日韩欧美国产1| 亚洲高清黄色| 国产又粗又长又爽视频| 91麻豆精品在线观看| 96日本xxxxxⅹxxx17| 国产+人+亚洲| 久久要要av| 国产精品边吃奶边做爽| 欧美另类一区二区三区| www.51av欧美视频| 中文字幕精品—区二区日日骚| 成人18视频在线播放| 一本色道久久综合精品婷婷| 午夜精品久久久久久久99黑人|