node.js中的socket.io入門實例
關(guān)于websocket等反向ajax技術(shù)介紹
在實時web應(yīng)用中,常見的方法是反向Ajax。反向Ajax的定義:
反向Ajax(Reverse Ajax)本質(zhì)上則是這樣的一種概念:能夠從服務(wù)器端向客戶端發(fā)送數(shù)據(jù)。在一個標準的HTTP Ajax請求中,數(shù)據(jù)是發(fā)送給服務(wù)器端的,反向Ajax可以某些特定的方式來模擬發(fā)出一個Ajax請求,這些方式本文都會論及,這樣的話,服務(wù)器就可以盡可能快地向客戶端發(fā)送事件(低延遲通信)。
反向Ajax技術(shù)主要有兩點內(nèi)容:一是服務(wù)器端保持住TCP連接直到其有數(shù)據(jù)發(fā)送給客戶端(可以使用循環(huán)和睡眠實現(xiàn)),二是客戶端js編程技巧。
websocket是html5的規(guī)范,也屬于反ajax技術(shù)。
socket.io實現(xiàn)反向AJAX技術(shù)實例
socket.io官方介紹:
Socket.IO aims to make realtime apps possible in every browser and mobile device, blurring the differences between the different transport mechanisms. It's care-free realtime 100% in JavaScript. In order to provide realtime connectivity on every browser, Socket.IO selects the most capable transport at runtime, without it affecting the API. WebSocket Adobe® Flash® Socket AJAX long polling AJAX multipart streaming Forever Iframe JSONP Polling
簡單來說socket.io是一個基于nodejs的庫,其對多種反向ajax技術(shù)進行了包裝并統(tǒng)一了接口。在運行時候socket.io自動根據(jù)瀏覽器的情況選擇合適的反向ajax技術(shù)與socket.io服務(wù)器進行交互。如果說websocket等技術(shù)是規(guī)范的話,那么socket.io則屬于應(yīng)用。
下面說一下如何安裝(作者使用Linux Mint 16):
安裝node.js:
輸入命令nodejs即可進入shell模式。
安裝npm:
安裝socket.io:
安裝包存放在~/node_modules目錄下,客戶端socket.io.js存放在~/node_modules/socket.io/node_modules/socket.io-client/dist目錄下。
socket.io示例
以下示例來自官方網(wǎng)站并做了適當修改。
首先建立server端(服務(wù)端)代碼(文件test.js):
var io = require('socket.io').listen(8080);
io.sockets.on('connection', function (socket) {
socket.emit('news', { hello: 'world' });
socket.on('my other event', function (data) {
console.log(data);
});
});
服務(wù)端test.js綁定了8080端口,當一個客戶端連接服務(wù)端test.js時候,服務(wù)端test.js向客戶端發(fā)出news指令并傳送數(shù)據(jù){ hello: 'world' };而服務(wù)端test.js收到my other event指令時候會調(diào)用回調(diào)函數(shù)function (data) { console.log(data);}來處理接收到的數(shù)據(jù)data。
筆者搭建了nginx服務(wù)器,其使用的80端口,web根目錄為/usr/share/nginx/html。將~/node_modules/socket.io/node_modules/socket.io-client/dist下的socket.io.min.js復(fù)制到web根目錄,并在在web根目錄下建立文件index.php(作為客戶端),內(nèi)容如下:
<html>
<head>
</head>
<script src="socket.io.min.js"></script>
<body>
<script>
var socket = io.connect('http://localhost:8080');
socket.on('news', function (data) {
console.log(data);
console.log(data["hello"]);
socket.emit('my other event', { my: 'data' });
});
</script>
</body>
</html>
上面代碼中,socket綁定了8080端口,也就是綁定了server端。socket.on()指定了當收到news指令時候,應(yīng)該如何處理收到的指令對應(yīng)的數(shù)據(jù),socket.emit()向server端發(fā)送指令和數(shù)據(jù)。
運行server端:
運行客戶端并進行觀察:打開瀏覽器,進入http://127.0.0.1訪問index.php,并打開firebug查看信息。
上圖來自firebug,表明了客戶端index.php連接服務(wù)端test.js后收到了來自服務(wù)端test.js的數(shù)據(jù){hello:"world"}。同時也能夠看到index.php訪問server的網(wǎng)址并非簡單的http://localhost:8080。
上圖顯示了服務(wù)端test.js的處理過程。上圖是客戶端index.php第一次向服務(wù)端test.js發(fā)送的http頭。
上圖是客戶端index.php第2次向服務(wù)端test.js發(fā)送的http頭。使用了websocket規(guī)范。當關(guān)掉服務(wù)端test.js時候客戶端index.php出現(xiàn)很多Aborted狀態(tài)(紅字部分)。
分析結(jié)束。
相關(guān)文章
精通JavaScript 糾正 cleanWhitespace函數(shù)
這個函數(shù)用在火狐(firefox)上面老是出錯,今天仔細研究了下,改正了,希望別人不要遇到我這樣的問題2010-03-03Three.js學(xué)習之Lamber材質(zhì)和Phong材質(zhì)
本篇將介紹基本材質(zhì)以及兩種基于光照模型的材質(zhì)(Lamber與Phong),有需要的小伙伴們可以參考學(xué)習。2016-08-08Highcharts學(xué)習之數(shù)據(jù)列
數(shù)據(jù)列配置是 Highcharts 最復(fù)雜也是最靈活的配置,如果說 Highcharts 是靈活多變,細節(jié)可定制的話,那么數(shù)據(jù)列配置就是這個重要特性的核心。2016-08-08淺談JavaScript前端開發(fā)的MVC結(jié)構(gòu)與MVVM結(jié)構(gòu)
以AngularJS為代表的MVVM結(jié)構(gòu)框架或庫這兩年來在前端界真是火到不行,大有對抗傳統(tǒng)jQuery綁定思想的趨勢,這里我們結(jié)合傳統(tǒng)的MVC結(jié)構(gòu),來淺談JavaScript前端開發(fā)的MVC結(jié)構(gòu)與MVVM結(jié)構(gòu)2016-06-06