狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

HTML5 WebSockets+NodeJs 實(shí)例教程

admin
2015年7月10日 17:27 本文熱度 7472

HTML 5 中WebSockets是極其重要的部分,它的一個(gè)好處之一是減少了不必要的網(wǎng)絡(luò)流量。它主要是用于在客戶機(jī)和服務(wù)器之間建立單一的雙向連接。這意味著客戶只需要發(fā)送一個(gè)請(qǐng)求到服務(wù)端,那么服務(wù)端則會(huì)進(jìn)行處理,處理好后則將其返回給客戶端,客戶端則可以在等待這個(gè)時(shí)間繼續(xù)去做其他工作,整個(gè)過程是異步的。

WebSockets應(yīng)用的場(chǎng)景是很廣泛的,當(dāng)需要實(shí)時(shí)顯示數(shù)據(jù)的時(shí)候(比如股票,實(shí)時(shí)聊天,對(duì)戰(zhàn)游戲等),用戶最期望的是不需要去刷新頁(yè)面,否則獲得的用戶體驗(yàn)是不佳的。而在最新的HTML 5標(biāo)準(zhǔn)中,出現(xiàn)了兩個(gè)解決該方面問題的規(guī)范,一個(gè)是服務(wù)端推送事件(Server Sent Events),另外一個(gè)是WebSockets,其中服務(wù)端推送事件由于在IE 中不能獲得原生支持,因此不在本文討論范圍之中。本文著重講解HTML 5中WebSockets的相關(guān)知識(shí)。首先我們還是來復(fù)習(xí)下在HTTP 的網(wǎng)絡(luò)世界中的基本架構(gòu),這是下一步學(xué)習(xí)的基礎(chǔ)。

客戶-服務(wù)器模式是網(wǎng)絡(luò)世界中最經(jīng)典的模式了,能允許多個(gè)用戶通過前端圖形界面的方式去,如下圖:

 

通常,客戶服務(wù)端模式分為兩層和三層。在三層結(jié)構(gòu)中,通常是出現(xiàn)在web應(yīng)用中,中間一層使用了各類的中間件服務(wù)器,分別如下兩圖所示:

 

 

我們來看下HTML 5 WebSocket的架構(gòu)圖,如下:

 

  

在HTML 5 WebSockets標(biāo)準(zhǔn)中,僅僅定義了一些列的API,這些API用來在客戶端和服務(wù)端之間建立“socket”連接。下面我們來學(xué)習(xí)使用node.js來進(jìn)行WebSockets的學(xué)習(xí)。

首先,到node.js的官網(wǎng)下載node.js,我們選用windows 版本就可以了。

 

下載安裝包后并選擇socket.io,這只需要在 安裝好的nodejs目錄下,運(yùn)行命令install就可以了,如圖:

 

 

然后,我們?cè)趎odejs目錄下建立一個(gè)簡(jiǎn)單的js文件,命名為serverfile.js,然后編寫代碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 var http = require('http');  
 var io = require('socket.io');     
 var yourserver = http.createServer(function (request, response) {      
         response.writeHead(250, { 'Content-Type''text/html' });      
         response.end('Your WebSocket server is running');  
     }).listen(22222);     
var yoursocket = io.listen(yourserver).set('log', 1);     
yoursocket.on('connection'function (client) {      
    client.on('message'function (data) {          
        console.log('Client Message: ', data);              
        var current = new Date().getTime();             
        client.emit('YourMessageResponse', data + '->' + current);   
        client.on('disconnect'function () {   
            console.log('Your Client disconnected');  
        });      
    });  
});

然后重新在nodejs的目錄中輸入如下圖的命令,以啟動(dòng)服務(wù)端:

這樣,服務(wù)端就已經(jīng)啟動(dòng)了,下面來編寫客戶端,客戶端其實(shí)就是一個(gè)簡(jiǎn)單的html頁(yè)面,代碼如下:

 <!DOCTYPE html> 
 <html> 
 <head>     
     <script src='http://localhost:22222/socket.io/socket.io.js'></script> 
 </head> 
 <body>     
 <script>         
 var HTML5WebSockets = {};          
 HTML5WebSockets.socketio = {
     
     yoursocket: null,                 
     initialize: function () {
                          
         HTML5WebSockets.socketio.yoursocket = io.connect('http://localhost:22222');                    HTML5WebSockets.socketio.yoursocket.on('connect', function () {                      
             HTML5WebSockets.socketio.log('You are connected to Server<br />');
         });
                              
         HTML5WebSockets.socketio.yoursocket.on('message', function (data) {                              HTML5WebSockets.socketio.log('Server Response:  ' + data + '<br />');                        });                                
         HTML5WebSockets.socketio.yoursocket.on('disconnect', function () {                                 HTML5WebSockets.socketio.log('You are disconnected from Server<br />');                    });
                              
         document.querySelector('#sendMes').onclick = function () {                      
            HTML5WebSockets.socketio.sendMessageToServer(document.querySelector('#mes').value);            document.querySelector('#mes').value = '';                  
         };                              
     },              
     
     sendMessageToServer: function (data) {                  
         HTML5WebSockets.socketio.yoursocket.send(data);                  
         HTML5WebSockets.socketio.log('Message to Server: ' + data + '<br />');              
     },                           
     log: function (message) {                  
         document.querySelector('#log').innerHTML += message;              
     }          
 }      
 </script>        
 <div id='log'></div>     
 <input type='text' id='mes' />     
 <button type='button' id='sendMes'>Send</button>     
 <br />        
 <script>         
     HTML5WebSockets.socketio.initialize();      
 </script> 
 </body> 
 </html>

現(xiàn)在假設(shè)服務(wù)端已經(jīng)運(yùn)行后,我們可以直接在瀏覽器中輸入網(wǎng)址運(yùn)行,如下圖:

 

這個(gè)時(shí)候表示客戶端已經(jīng)和服務(wù)端連接上了(這個(gè)時(shí)候調(diào)用的是

HTML5WebSockets.socketio.yoursocket.on的方法)。

接下來我們?cè)谖谋究蛑休斎胍恍┮l(fā)送到服務(wù)端的信息,并點(diǎn)Send按鈕,則可以從日志信息中看到信息發(fā)送到服務(wù)端的提示,如下兩圖所示: 

 

同時(shí)我們也觀察下服務(wù)端的控制臺(tái)的輸出,如下所示:

 

可以看到服務(wù)端正確收到了來自客戶段的請(qǐng)求信息。

從上面的例子可以看到,node.js由于使用了Socket.io 模塊,大大減輕了使用WebSocket的難度,可以說是為WebSocket而生的。

接下來,我們看下如何對(duì)客戶端進(jìn)行廣播消息?所謂的廣播消息,就是將某個(gè)消息在同一時(shí)間發(fā)送給已連接服務(wù)端的所有客戶端,所有客戶端都能收到該消息。下面我們動(dòng)手改造下服務(wù)端的代碼如下:

var http = require('http');  
var io = require('socket.io');     
var yourserver = http.createServer(function (request, response) {      
        response.writeHead(250, { 'Content-Type': 'text/html' });
        response.end('Your WebSocket server is running');
    }).listen(22222);
var yoursocket = io.listen(yourserver).set('log', 1);

yoursocket.on('connection', function (client) {
    client.on('YourcustomMessage', function (data) {
        console.log('Client Custom Message: ', data);
            var current = new Date().getTime();
            client.broadcast.emit('YourMessageResponse', data + '(broadcasted)->' + current);      });      
    client.on('disconnect', function () {          
        console.log('Your Client disconnected');      
    });  
});

可以看到,唯一和之前服務(wù)端代碼不同的是使用了client.broadcast.emit方法,可以從Socket.IO 服務(wù)器將廣播消息發(fā)送給客戶端。并且為了驗(yàn)證我們是在同一時(shí)刻發(fā)送相同的消息給各個(gè)客戶端,我們?cè)O(shè)置了當(dāng)前的時(shí)間到current變量進(jìn)行返回。我們可以將該文件另存為serverfile2.js。然后同樣按上文的方法啟動(dòng)服務(wù)端。

接下來編寫客戶端代碼如下:

<!DOCTYPE html> 
<html> 
    <head>     
        <script src='http://localhost:22222/socket.io/socket.io.js'></script> 
    </head> 
<body>     
    <script>         
        var HTML5WebSockets = {};          
        HTML5WebSockets.socketio = {              
            yoursocket: null,                 
            initialize: function () {                     
                HTML5WebSockets.socketio.yoursocket = io.connect('http://localhost:22222');                    HTML5WebSockets.socketio.yoursocket.on('connect', function () {                                    HTML5WebSockets.socketio.log('You are connected to Server<br />');                         });                                    

                HTML5WebSockets.socketio.yoursocket.on('YourMessageResponse', function (data) {                    HTML5WebSockets.socketio.log('Server Custom Response: ' + data + '<br />');                });                     

                HTML5WebSockets.socketio.yoursocket.on('disconnect', function () {                                 HTML5WebSockets.socketio.log('You are disconnected from Server<br />');                    });                                    

                document.querySelector('#sendCustMes').onclick = function () {                                     HTML5WebSockets.socketio.emitCustomMessageToServer(document.querySelector('#custMes').value); 
                document.querySelector('#custMes').value = '';                  
                };              
            },                           

            emitCustomMessageToServer: function (data) {                  

                HTML5WebSockets.socketio.yoursocket.emit('YourcustomMessage', data);                  
                HTML5WebSockets.socketio.log('Custom message to Server: ' + data + '<br />');              
            },                 
            log: function (message) {                  
                document.querySelector('#log').innerHTML += message;              
            }          
        }      
</script>        
<div id='log'></div>     
<input type='text' id='custMes' />     
<button type='button' id='sendCustMes'>Brodcast</button>        
<script>         
    HTML5WebSockets.socketio.initialize();      
</script> 
</body> 
</html>

可以看到客戶端的代碼并沒有多大變化。接下來我們同時(shí)啟動(dòng)多個(gè)瀏覽器打開這個(gè)客戶端的文件,如下圖:

 

這表明各個(gè)客戶端都已經(jīng)連接上服務(wù)端了,然后在其中的一個(gè)客戶端頁(yè)面中輸入任意內(nèi)容,點(diǎn)發(fā)送,則可以看到服務(wù)端的nodejs控制臺(tái)收到了該消息,并且同時(shí)將當(dāng)前時(shí)間附加到消息中,同時(shí)發(fā)送到各請(qǐng)求的客戶端,實(shí)現(xiàn)了廣播的功能,如下圖:

 

 

讀者可以進(jìn)一步對(duì)上面的nodejs例子進(jìn)行改造,就可以很容易實(shí)現(xiàn)如各類實(shí)時(shí)應(yīng)用了。

轉(zhuǎn)自:http://my.oschina.net/fuckboogie/blog/201615

英文原文:HTML5 WebSockets Introduction 


該文章在 2015/7/10 17:27:40 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved