九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
WebSocket的簡單介紹及應(yīng)用

定時刷新的不足與改進(jìn)

web開發(fā)中可能遇到這樣的場景:網(wǎng)頁里的某一塊區(qū)域里寫了一些內(nèi)容,但這些內(nèi)容不是固定的,即使看網(wǎng)頁的人沒有做任何操作,它們也會隨時間不斷變化。股票行情、活動或游戲的榜單都是比較常見的例子。

對此,一般的做法是用 setTimeout()setInverval() 定時執(zhí)行任務(wù),任務(wù)內(nèi)容是Ajax訪問一次服務(wù)器,并在成功拿到返回數(shù)據(jù)后去更新頁面。

這種定時刷新的做法會有這樣一些感覺不足的地方:

  • 頻繁的定時網(wǎng)絡(luò)請求對瀏覽器(客戶端)和服務(wù)器來說都是一種負(fù)擔(dān),尤其是當(dāng)網(wǎng)頁里有多個定時刷新區(qū)域的時候。
  • 某幾次的定時任務(wù)可能是不必要的,因為服務(wù)器可能并沒有新數(shù)據(jù),還是返回了和上一次一樣的內(nèi)容。
  • 頁面內(nèi)容可能不夠新,因為服務(wù)器可能剛更新了數(shù)據(jù),但下一輪定時任務(wù)還沒有開始。

造成這些不足的原因歸結(jié)起來,主要還是由于服務(wù)器的響應(yīng)總是被動的。HTTP協(xié)議限制了一次通信總是由客戶端發(fā)起請求,再由服務(wù)器端來返回響應(yīng)。

因此,如果讓服務(wù)器端也可以主動發(fā)送信息到客戶端,就可以很大程度改進(jìn)這些不足。WebSocket就是一個實現(xiàn)這種雙向通信的新協(xié)議。

WebSocket是基于HTTP的功能追加協(xié)議

WebSocket最初由html5提出,但現(xiàn)在已經(jīng)發(fā)展為一個獨立的協(xié)議標(biāo)準(zhǔn)。WebSocket可以分為協(xié)議( Protocol )和 API 兩部分,分別由 IETF 和W3C制定了標(biāo)準(zhǔn)。

先來看看WebSocket協(xié)議的建立過程。

為了實現(xiàn)WebSocket通信,首先需要客戶端發(fā)起一次普通HTTP請求(也就是說,WebSocket的建立是依賴HTTP的)。請求報文可能像這樣:

GET ws://websocket.example.com/ HTTP/1.1Host: websocket.example.comUpgrade: websocketConnection: UpgradeOrigin: http://example.comSec-WebSocket-Key:pAloKxsGSHtpIHrJdWLvzQ==Sec-WebSocket-Version:13

其中HTTP頭部字段 Upgrade: websocketConnection: Upgrade 很重要,告訴服務(wù)器通信協(xié)議將發(fā)生改變,轉(zhuǎn)為WebSocket協(xié)議。支持WebSocket的服務(wù)器端在確認(rèn)以上請求后,應(yīng)返回狀態(tài)碼為 101 Switching Protocols 的響應(yīng):

HTTP/1.1 101 Switching ProtocolsUpgrade: websocketConnection: UpgradeSec-WebSocket-Accept: nRu4KAPUPjjWYrnzxDVeqOxCvlM=

其中字段 Sec-WebSocket-Accept 是由服務(wù)器對前面客戶端發(fā)送的 Sec-WebSocket-Key 進(jìn)行確認(rèn)和加密后的結(jié)果,相當(dāng)于一次驗證,以幫助客戶端確信對方是真實可用的WebSocket服務(wù)器。

驗證通過后,這個握手響應(yīng)就確立了WebSocket連接,此后,服務(wù)器端就可以主動發(fā)信息給客戶端了。此時的狀態(tài)比較像服務(wù)器端和客戶端接通了電話,無論是誰有什么信息想告訴對方,開口就好了。

一旦建立了WebSocket連接,此后的通信就不再使用HTTP了,改為使用WebSocket獨立的數(shù)據(jù)幀(這個幀有辦法看到,見后文)。

整個過程像這樣:

簡單的應(yīng)用示例

應(yīng)用WebSocket有這樣幾件事要做:

  • 選用 支持WebSocket的瀏覽器 。
  • 網(wǎng)頁內(nèi)添加創(chuàng)建WebSocket的代碼。
  • 服務(wù)器端添加使用WebSocket通信的代碼。

服務(wù)器端

以Node的服務(wù)器為例,我們使用 ws 這個組件,這樣搭建一個支持WebSocket的服務(wù)器端:

var request = require("request");var dateFormat = require("dateformat");var WebSocket = require("ws"),    WebSocketServer = WebSocket.Server,    wss = new WebSocketServer({        port: 8080,        path: "/guest"    });// 收到來自客戶端的連接請求后,開始給客戶端推消息wss.on("connection", function(ws) {    ws.on("message", function(message) {        console.log("received: %s", message);    });    sendGuestInfo(ws);});function sendGuestInfo(ws) {    request("http://uinames.com/api?region=china",        function(error, response, body) {            if (!error && response.statusCode === 200) {                var jsonObject = JSON.parse(body),                    guest = jsonObject.name + jsonObject.surname,                    guestInfo = {                        guest: guest,                        time: dateFormat(new Date(), "HH:MM:ss")                    };                if (ws.readyState === WebSocket.OPEN) {                    // 發(fā),送                    ws.send(JSON.stringify(guestInfo));                    // 用隨機(jī)來“裝”得更像不定時推送一些                    setTimeout(function() {                        sendGuestInfo(ws);                    }, (Math.random() * 5 + 3) * 1000);                }            }        });}

這個例子使用了姓名生成站點 uinames 的API服務(wù),來生成 {guest: "人名", time: "15:26:01"} 這樣的數(shù)據(jù)。函數(shù) sendGuestInfo() 會不定時執(zhí)行,并把包含姓名和時間的信息通過 send() 方法發(fā)送給客戶端。另外,注意 send() 方法需要以字符串形式來發(fā)送json數(shù)據(jù)。

這就像是服務(wù)器自己在做一些事,然后在需要的時候會通知客戶端一些信息。

客戶端

客戶端我們使用原生javascript來完成(僅支持WebSocket的瀏覽器):

var socket = new WebSocket("ws://localhost:8080/guest");socket.onopen = function(openEvent) {    console.log("WebSocket conntected.");};socket.onmessage = function(messageEvent) {    var data = messageEvent.data,        dataObject = JSON.parse(data);    console.log("Guest at " + dataObject.time + ": " + dataObject.guest);};socket.onerror = function(errorEvent) {    console.log("WebSocket error: ", errorEvent);};socket.onclose = function(closeEvent) {    console.log("WebSocket closed.");};

WebSocket的URL格式是 ws://wss:// 。因此,需要注意下URL地址的寫法,這也包括注意WebSocket服務(wù)器端的路徑(如這里的 /guest )等信息。因為是本地的示例所以這里是 localhost 。

客戶端代碼的流程很簡單:創(chuàng)建 WebSocket 對象,然后指定 onopen 、 onmessage 等事件的回調(diào)即可。其中 onmessage 是客戶端與服務(wù)器端通過WebSocket通信的關(guān)鍵事件,想要在收到服務(wù)器通知后做點什么,寫在 onmessage 事件的回調(diào)函數(shù)里就好了。

效果及分析

通過 node server (假定服務(wù)器端的文件名為 server.js )啟動WebSocket服務(wù)器后,用瀏覽器打開一個引入了前面客戶端代碼的html(直接文件路徑 file:/// 就可以),就可以得到像這樣的結(jié)果:

聯(lián)系前面客戶端的代碼可以想到,實際從創(chuàng)建 WebSocket 對象的語句開始,連接請求就會發(fā)送,并很快建立起WebSocket連接(不出錯誤的話),此后就可以收到來自服務(wù)器端的通知。如果此時客戶端還想再告訴服務(wù)器點什么,這樣做:

socket.send("Hello, server!");

服務(wù)器就可以收到:

當(dāng)然,這也是因為前面服務(wù)器端的代碼內(nèi)同樣設(shè)置了 message 事件的回調(diào)。在這個客戶端和服務(wù)器都是javascript的例子中,無論是服務(wù)器端還是客戶端,都用 send() 發(fā)送信息,都通過 message 事件設(shè)置回調(diào),形式上可以說非常一致。

其他可用的數(shù)據(jù)類型

WebSocket的 send() 可以發(fā)送的消息,除了前面用的字符串類型之外,還有兩種可用,它們是 BlobArrayBuffer 。

它們都代表二進(jìn)制數(shù)據(jù),可用于原始文件數(shù)據(jù)的發(fā)送。比如,這是一個發(fā)送Blob類型數(shù)據(jù)以完成向服務(wù)器上傳圖片的例子:

var fileEl = document.getElementById("image_upload");var file = fileEl.files[0];socket.send(file);

然后服務(wù)器端可以這樣把文件保存下來:

var fs = require("fs");wss.on("connection", function(ws) {    ws.on("message", function(message) {        fs.writeFile("upload.png", message, "binary", function(error) {            if (!error) {                console.log("File saved.");            }        });    });});

在客戶端接收二進(jìn)制數(shù)據(jù)時,需注意WebSocket對象有一個屬性 binaryType ,初始值為 "blob" 。因此,如果接收的二進(jìn)制數(shù)據(jù)是 ArrayBuffer ,應(yīng)在接收之前這樣做:

socket.binaryType = "arraybuffer";

其他WebSocket服務(wù)器端

其他語言來做WebSocket服務(wù)器是怎樣的呢?下面是一個php的WebSocket服務(wù)器的例子(使用 Ratchet ):

<?phpuse Ratchet\ConnectionInterface;use Ratchet\MessageComponentInterface;require __DIR__ . '/vendor/autoload.php';class GuestServer implements MessageComponentInterface {    public function onOpen(ConnectionInterface $conn) {        $conn->send('The server is listening to you now.');    }    public function onMessage(ConnectionInterface $conn, $msg) {        $conn->send($this->generateGuestInfo());    }    public function onClose(ConnectionInterface $conn) {    }    public function onError(ConnectionInterface $conn, \Exception $e) {        $conn->close();    }    private function generateGuestInfo() {        $jsonString = file_get_contents('http://uinames.com/api?region=china');        $jsonObject = json_decode($jsonString, true);        $guest = $jsonObject['name'] . $jsonObject['surname'];        $guestInfo = array(            'guest' => $guest,            'time' => date('H:i:s', time()),        );        return json_encode($guestInfo);    }}$app = new Ratchet\App('localhost', 8080);$app->route('/guest', new GuestServer(), array('*'));$app->run();?>

這個例子也同樣是由服務(wù)器返回 {guest: "人名", time: "15:26:01"} 的json數(shù)據(jù),不過由于php不像Node那樣可以用 setTimeout() 很容易地實現(xiàn)異步定時任務(wù),這里改為在客戶端發(fā)送一次任意信息后,再去uinames取得信息并返回。

也可以看到,php搭建的WebSocket服務(wù)器仍然是近似的,主要通過WebSocket的 open 、 message 等事件來實現(xiàn)功能。

在Chrome開發(fā)工具中查看WebSocket數(shù)據(jù)幀

Chrome開發(fā)工具中選擇Network,然后找到WebSocket的那個請求,里面可以選擇Frames。在Frames里看到的,就是WebSocket的數(shù)據(jù)幀了:

可以看到很像聊天記錄,其中用淺綠色標(biāo)注的是由客戶端發(fā)送給服務(wù)器的部分。

結(jié)語

總的來說,把服務(wù)器和客戶端拉到了一個聊天窗口來辦事,這確實是很棒的想法。

即使只從形式上說,WebSocket的事件回調(diào)感覺也比定時任務(wù)用起來要更親切一些。

============================================

WebSocket

編輯鎖定
WebSocket protocol 是HTML5一種新的協(xié)議。它實現(xiàn)了瀏覽器與服務(wù)器全雙工通信(full-duplex)。
外文名
WebSocket
解    釋
HTML5一種新的協(xié)議
優(yōu)    點
服務(wù)器可以主動傳送數(shù)據(jù)給客戶端
功    能
實現(xiàn)了瀏覽器與服務(wù)器全雙工通信

背景

編輯
在瀏覽器中通過http僅能實現(xiàn)單向的通信,comet可以一定程度上模擬雙向通信,但效率較低,并需要服務(wù)器有較好的支持; flash中的socket和xmlsocket可以實現(xiàn)真正的雙向通信,通過 flex ajax bridge,可以在javascript中使用這兩項功能. 可以預(yù)見,如果websocket一旦在瀏覽器中得到實現(xiàn),將會替代上面兩項技術(shù),得到廣泛的使用.面對這種狀況,HTML5定義了WebSocket協(xié)議,能更好的節(jié)省服務(wù)器資源和帶寬并達(dá)到實時通訊。
在JavaEE7中也實現(xiàn)了WebSocket協(xié)議。

原理

編輯
WebSocket protocol 。
現(xiàn)很多網(wǎng)站為了實現(xiàn)即時通訊,所用的技術(shù)都是輪詢(polling)。輪詢是在特定的的時間間隔(如每1秒),由瀏覽器對服務(wù)器發(fā)出HTTP request,然后由服務(wù)器返回最新的數(shù)據(jù)給客戶端的瀏覽器。這種傳統(tǒng)的HTTP request 的模式帶來很明顯的缺點 – 瀏覽器需要不斷的向服務(wù)器發(fā)出請求,然而HTTP request 的header是非常長的,里面包含的有用數(shù)據(jù)可能只是一個很小的值,這樣會占用很多的帶寬。
而比較新的技術(shù)去做輪詢的效果是Comet – 用了AJAX。但這種技術(shù)雖然可達(dá)到全雙工通信,但依然需要發(fā)出請求。
在 WebSocket API,瀏覽器和服務(wù)器只需要做一個握手的動作,然后,瀏覽器和服務(wù)器之間就形成了一條快速通道。兩者之間就直接可以數(shù)據(jù)互相傳送。在此WebSocket 協(xié)議中,為我們實現(xiàn)即時服務(wù)帶來了兩大好處:
1. Header
互相溝通的Header是很小的-大概只有 2 Bytes
2. Server Push

握手協(xié)議

編輯
在實現(xiàn)websocket連線過程中,需要通過瀏覽器發(fā)出websocket連線請求,然后服務(wù)器發(fā)出回應(yīng),這個過程通常稱為“握手” (handshaking)。
PS1:握手協(xié)議在后期的版本中,會標(biāo)明版本編號,下面的例子屬于早期的協(xié)定之一,對于新版的 chrome 和 Firefox 皆不適用。
PS2:后期的版本大多屬于功能上的擴(kuò)充,例如使用第7版的握手協(xié)議同樣也適用于第8版的握手協(xié)議。
例子:
瀏覽器請求
GET /demo HTTP/1.1
Host: 你的網(wǎng)址.com
Connection: Upgrade
Sec-WebSocket-Key2: 12998 5 Y3 1 .P00
Upgrade: WebSocket
Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5
Origin: http://你的網(wǎng)址.com
^n:ds[4U
//2010年之后的新版本websocket協(xié)議的Sec-WebSocket-Key只有一個,新的瀏覽只支持一個的,google的phpwebsocket用的是之前的協(xié)議所以不能直接運行通過,現(xiàn)在有個新版本是基于這個協(xié)議的是php-websocket-server-1
服務(wù)器回應(yīng)
HTTP/1.1 101
WebSocket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
Sec-WebSocket-Origin: http://你的網(wǎng)址.com
Sec-WebSocket-Location: ws://你的網(wǎng)址.com/demo
Sec-WebSocket-Protocol: sample
8jKS’y:G*Co,Wxa-

瀏覽器

編輯
實現(xiàn)了websocket的瀏覽器:
Chrome
Supported in version 4+
Firefox
Supported in version 4+
Internet Explorer
Supported in version 10+
Opera
Supported in version 10+
Safari
Supported in version 5+

服務(wù)器

編輯
在服務(wù)器端,也出現(xiàn)了一些實現(xiàn)websocket協(xié)議的項目:
jetty 7.0.1 包含了一個初步的實現(xiàn)
resin 包含有websocket 實現(xiàn)
pywebsocket, apache http server 擴(kuò)展
apache tomcat 7.0.27 版本
Nginx 1.3.13 版本
jWebSocket java實現(xiàn)版
websocket api在瀏覽器端的廣泛實現(xiàn)似乎只是一個時間問題了, 值得注意的是服務(wù)器端沒有標(biāo)準(zhǔn)的api, 各個實現(xiàn)都有自己的一套api, 并且jcp也沒有類似的提案, 所以使用websocket開發(fā)服務(wù)器端有一定的風(fēng)險.可能會被鎖定在某個平臺上或者將來被迫升級.
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
WebSocket使用
HTML5服務(wù)器推送消息的各種解決辦法
WebSocket
全雙工通信的 WebSocket
WebSocket 淺析
一文吃透 WebSocket 原理
更多類似文章 >>
生活服務(wù)
熱點新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服