摘要:但是,反過來卻是不可能的服務(wù)器端發(fā)生了一個事件,服務(wù)器無法將這個事件的信息實時主動通知它的客戶端。這種做法是無奈之舉,實際上對服務(wù)器客戶端雙方都造成了大量的性能浪費。用于發(fā)送,用戶接受。
HTTP
HTTP無法輕松實現(xiàn)實時應(yīng)用:
HTTP協(xié)議是無狀態(tài)的,服務(wù)器只會響應(yīng)來自客戶端的請求,但是它與客戶端之間不具備持續(xù)連接。
我們可以非常輕松的捕獲瀏覽器上發(fā)生的事件(比如用戶點擊了盒子),這個事件可以輕松產(chǎn)生與服務(wù)器的數(shù)據(jù)交互(比如Ajax)。但是,反過來卻是不可能的:服務(wù)器端發(fā)生了一個事件,服務(wù)器無法將這個事件的信息實時主動通知它的客戶端。只有在客戶端查詢服務(wù)器的當(dāng)前狀態(tài)的時候,所發(fā)生事件的信息才會從服務(wù)器傳遞到客戶端。
但是,確實聊天室確實存在
方法:
長輪詢:客戶端每隔很短的時間,都會對服務(wù)器發(fā)出請求,查看是否有新的消息,只要輪詢速度足夠快,例如1秒,就能給人造成交互是實時進行的印象。這種做法是無奈之舉,實際上對服務(wù)器、客戶端雙方都造成了大量的性能浪費。
長連接:客戶端只請求一次,但是服務(wù)器會將連接保持,不會返回結(jié)果(想象一下我們沒有寫res.end()時,瀏覽器一直轉(zhuǎn)小菊花)。服務(wù)器有了新數(shù)據(jù),就將數(shù)據(jù)發(fā)回來,又有了新數(shù)據(jù),就將數(shù)據(jù)發(fā)回來,而一直保持掛起狀態(tài)。這種做法的也造成了大量的性能浪費。
WebSocket協(xié)議WebSocket協(xié)議能夠讓瀏覽器和服務(wù)器全雙工實時通信,互相的,服務(wù)器也能主動通知客戶端
WebSocket的原理非常的簡單:利用HTTP請求產(chǎn)生握手,HTTP頭部中含有WebSocket協(xié)議的請求,所以握手之后,二者轉(zhuǎn)用TCP協(xié)議進行交流(QQ的協(xié)議)?,F(xiàn)在的瀏覽器和服務(wù)器之間,就是QQ和QQ服務(wù)器的關(guān)系了。所以WebSocket協(xié)議,需要瀏覽器支持,更需要服務(wù)器支持。
支持WebSocket協(xié)議的瀏覽器有:Chrome 4、火狐4、IE10、Safari5
支持WebSocket協(xié)議的服務(wù)器有:Node 0、Apach7.0.2、Nginx1.3
Socket.IO是業(yè)界良心,新手福音。它屏蔽了所有底層細節(jié),讓頂層調(diào)用非常簡單。并且還為不支持WebSocket協(xié)議的瀏覽器,提供了長輪詢的透明模擬機制。
Node.js上需要寫一些程序,來處理TCP請求。 使用require("dgram") 模塊
Node的單線程、非阻塞I/O、事件驅(qū)動機制,使它非常適合Socket服務(wù)器。
Socket.ionpm install socket.io
制作index.html頁面。頁面中必須引入 /socket.io/socket.io.js, 調(diào)用io函數(shù),取得socket對象。
服務(wù)器中:
var io = require("sockte.io")(server); io.on("connection",function( socket ){ //socket 對象 socket.on("tiwen",function( msg ){ console.log("服務(wù)器接受到了請求"); //sockte.emit("huida","ok"); //單條返回 //廣播 , 就是給當(dāng)前所有用戶的發(fā)送信息。 io.emit("huida","ok"); }); });
客戶端和服務(wù)器,都有socket對象。 兩個對象都具有emit,和on的時間。emit用于發(fā)送,on用戶接受。
發(fā)送的內(nèi)容可以是任何類型的值。
前臺頁面:
index頁面
信息內(nèi)容: 發(fā)送:
后臺:
var http = require("http"); var fs = require("fs"); var server = http.createServer(function ( req,res ) { if ( req.url == "/" ) { // 顯示首頁 fs.readFile("./index.html",function ( err,data ) { res.end(data); }); } }); // 創(chuàng)建io對象 var io = require("socket.io")(server); // 監(jiān)聽連接事件 io.on("connection",function ( socket ) { console.log( "一個客戶端連接了" ); socket.on("tiwen",function ( msg ) { // console.log( "提問為:" + msg ); // socket.emit("huida","好呀"); // 加上廣播 io.emit("huida",msg); }); }); server.listen(80);
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/86359.html
摘要:簡介是的一個模塊,他提供通過進行通信的一種簡單方式,協(xié)議很復(fù)雜,但是提供了服務(wù)器和客戶端雙方的組件,所以只需要一個模塊就可以給應(yīng)用程序加入對的支持。而且還能支持不同的瀏覽器。它們之間有什么區(qū)別呢區(qū)別在于的是持久性的。 環(huán)境:Node v8.2.1; Npm v5.3.0; OS Windows10 在web開發(fā)中,我們使用HTTP協(xié)議,HTTP協(xié)議是基于文本的單向通訊機制,當(dāng)我們想要從...
摘要:是,是的,它可以建立起一個基于事件的實時的雙向交流方式,極大的簡化了的處理過程。開始搭建這個應(yīng)用幾乎只需要和最初級的知識,因為只搭建一個基本的程序。安裝好后創(chuàng)建一個,來配置應(yīng)用。 WebSocket與Socket.IO WebSocket是一種協(xié)議,有了它就可以在TCP協(xié)議的基礎(chǔ)上在瀏覽器和服務(wù)器之間建立起了一種全雙工的通道,它完全兼容HTTP協(xié)議,有了它使得Web應(yīng)用程序可以在瀏覽器...
大吉大利,今晚吃雞! - PUBG 時隔多日,終于再次拾起這個拖了很久的項目。并不是因為沒時間,也不是因為這個項目對于我來說有多困難,就是一個字————懶。此項目的后臺,當(dāng)然是選擇node.js來實現(xiàn)。作為一個前端,node.js比起java、php簡單多了。 node支持的webSocket 在npm中有很多支持webSocket的模塊,包括socket.io...
閱讀 2323·2019-08-30 15:54
閱讀 2045·2019-08-30 13:49
閱讀 728·2019-08-29 18:44
閱讀 880·2019-08-29 18:39
閱讀 1168·2019-08-29 15:40
閱讀 1589·2019-08-29 12:56
閱讀 3214·2019-08-26 11:39
閱讀 3160·2019-08-26 11:37