websocket

Websocket只是一個(gè)網(wǎng)絡(luò)通信協(xié)議
就像 http胸懈、ftp等都是網(wǎng)絡(luò)通信的協(xié)議扬舒;不要多想;
相對(duì)于HTTP這種非持久的協(xié)議來說抬闯,Websocket是一個(gè)持久化網(wǎng)絡(luò)通信的協(xié)議;

WebSocket和HTTP的關(guān)系

WebSocket和HTTP的關(guān)系

websocket+http.png

有交集关筒,但是并不是全部溶握。
Websocket只是借用了HTTP的一部分協(xié)議來完成一次握手。(HTTP的三次握手蒸播,此處只完成一次)

http和websocket 請(qǐng)求頭對(duì)比:

http請(qǐng)求頭.jpg

websocket請(qǐng)求頭.png

HTTP:
原來的時(shí)候睡榆,客戶端通過http(騎馬)帶著信請(qǐng)求服務(wù)器,服務(wù)器處理請(qǐng)求(寫回信)袍榆,再次通過http(騎馬)返回胀屿;鏈接斷開;

WebSocket:
客戶端通過http(騎馬)帶著信請(qǐng)求服務(wù)器包雀,但同時(shí)碉纳,攜帶了Upgrade:websocket和Connection:Upgrade(兩根管子),服務(wù)器如果支持WebSocket協(xié)議(有兩根管子的接口),使用Websocket協(xié)議返回可用信息(丟棄馬匹)馏艾,此后信息的傳遞劳曹,均使用這兩個(gè)管子,除非有一方人為的將管子切斷;若服務(wù)器不支持琅摩,客戶端請(qǐng)求鏈接失敗铁孵,返回錯(cuò)誤信息;

http和websocket 響應(yīng)頭對(duì)比:

http響應(yīng)頭.jpg

websocket響應(yīng)頭.jpg](http://upload-images.jianshu.io/upload_images/3776053-7c631bc894a77683.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

websocket和ajax輪詢房资、long poll的區(qū)別

首先是 ajax輪詢 蜕劝,ajax輪詢的原理非常簡單,讓瀏覽器隔個(gè)幾秒就發(fā)送一次請(qǐng)求轰异,詢問服務(wù)器是否有新信息
場景再現(xiàn):
客戶端:啦啦啦岖沛,有沒有新信息(Request)
服務(wù)端:沒有(Response)
客戶端:啦啦啦,有沒有新信息(Request)
服務(wù)端:沒有搭独。婴削。(Response)
客戶端:啦啦啦,有沒有新信息(Request)
服務(wù)端:你好煩啊牙肝,沒有啊唉俗。。(Response)
客戶端:啦啦啦配椭,有沒有新消息(Request)
服務(wù)端:好啦好啦虫溜,有啦給你。(Response)
客戶端:啦啦啦股缸,有沒有新消息(Request)
服務(wù)端:衡楞。。敦姻。沒瘾境。歧杏。。寄雀。沒得滤。。沒有

long poll 其實(shí)原理跟 ajax輪詢 差不多盒犹,都是采用輪詢的方式,不在論述懂更;

從上面可以看出,輪詢其實(shí)就是在不斷地建立HTTP連接急膀,然后等待服務(wù)端處理沮协,可以體現(xiàn)HTTP協(xié)議的另外一個(gè)特點(diǎn),被動(dòng)性卓嫂。同時(shí)慷暂,http的每一次請(qǐng)求與響應(yīng)結(jié)束后,服務(wù)器將客戶端信息全部丟棄晨雳,下次請(qǐng)求行瑞,必須攜帶身份信息(cookie),無狀態(tài)性餐禁;

Websocket的出現(xiàn)血久,干凈利落的解決了這些問題;

所以上面的情景可以做如下修改帮非。
客戶端:啦啦啦氧吐,我要建立Websocket協(xié)議,需要的服務(wù):chat末盔,Websocket協(xié)議版本:17(HTTP Request)
服務(wù)端:ok筑舅,確認(rèn),已升級(jí)為Websocket協(xié)議(HTTP Protocols Switched)
客戶端:麻煩你有信息的時(shí)候推送給我噢陨舱。翠拣。
服務(wù)端:ok,有的時(shí)候會(huì)告訴你的隅忿。
客戶端:balab開始斗圖alabala
服務(wù)端:你好啊ala
客戶端:流鼻血了心剥,我擦……
服務(wù)端:哈哈布爾教育牛啊哈哈哈哈
服務(wù)端:笑死我了哈哈

Swoole

但是,為了用PHP配合HTML5完成一次WebSocket請(qǐng)求和響應(yīng)背桐,哥走過千山萬水,在密林深處蝉揍,發(fā)現(xiàn)了Swoole : http://www.swoole.com/;

PHP語言的異步链峭、并行、高性能網(wǎng)絡(luò)通信框架又沾,使用純C語言編寫弊仪,提供了PHP語言的異步多線程服務(wù)器熙卡,異步TCP/UDP網(wǎng)絡(luò)客戶端,異步MySQL励饵,數(shù)據(jù)庫連接池驳癌,AsyncTask,消息隊(duì)列役听,毫秒定時(shí)器颓鲜,異步文件讀寫,異步DNS查詢典予。
支持的服務(wù):
HttpServer
WebSocket Server
TCP Server
TCP Client
Async-IO(異步)
Task(定時(shí)任務(wù))

環(huán)境依賴:
僅支持Linux甜滨,F(xiàn)reeBSD,MacOS瘤袖,3類操作系統(tǒng)
Linux內(nèi)核版本2.3.32以上
PHP5.3.10以上版本
gcc4.4以上版本或者clang
cmake2.4+衣摩,編譯為libswoole.so作為C/C++庫時(shí)需要使用cmake

安裝:
必須保證系統(tǒng)中有以下這些軟件:
php-5.3.10 或更高版本
gcc-4.4 或更高版本
make
autoconf

Swoole是作為PHP擴(kuò)展來運(yùn)行的

安裝(root權(quán)限):
cd swoole
phpize
./configure
make
sudo make install
配置php.ini
extension=swoole.so

想研究Swoole的同學(xué),自己去看手冊(雖然寫的不好捂敌,但是還是能看懂的)

做一個(gè)聊天室

服務(wù)器端:socket.php


//創(chuàng)建websocket服務(wù)器對(duì)象艾扮,監(jiān)聽0.0.0.0:9502端口
$ws = new swoole_websocket_server("0.0.0.0", 9502);

//監(jiān)聽WebSocket連接打開事件
$ws->on('open', function ($ws, $request) {
    $fd[] = $request->fd;
    $GLOBALS['fd'][] = $fd;
    //$ws->push($request->fd, "hello, welcome\n");
});

//監(jiān)聽WebSocket消息事件
$ws->on('message', function ($ws, $frame) {
    $msg =  'from'.$frame->fd.":{$frame->data}\n";
//var_dump($GLOBALS['fd']);
//exit;
    foreach($GLOBALS['fd'] as $aa){
        foreach($aa as $i){
            $ws->push($i,$msg);
        }
    }
   // $ws->push($frame->fd, "server: {$frame->data}");
    // $ws->push($frame->fd, "server: {$frame->data}");
});

//監(jiān)聽WebSocket連接關(guān)閉事件
$ws->on('close', function ($ws, $fd) {
    echo "client-{$fd} is closed\n";
});

$ws->start();

客戶端:Socket.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="msg"></div>
<input type="text" id="text">
<input type="submit" value="發(fā)送數(shù)據(jù)" onclick="song()">
</body>
<script>
    var msg = document.getElementById("msg");
    var wsServer = 'ws://192.168.1.253:9502';
    //調(diào)用websocket對(duì)象建立連接:
    //參數(shù):ws/wss(加密)://ip:port (字符串)
    var websocket = new WebSocket(wsServer);
    //onopen監(jiān)聽連接打開
    websocket.onopen = function (evt) {
        //websocket.readyState 屬性:
        /*
        CONNECTING  0   The connection is not yet open.
        OPEN    1   The connection is open and ready to communicate.
        CLOSING 2   The connection is in the process of closing.
        CLOSED  3   The connection is closed or couldn't be opened.
        */
        msg.innerHTML = websocket.readyState;
    };

    function song(){
        var text = document.getElementById('text').value;
        document.getElementById('text').value = '';
        //向服務(wù)器發(fā)送數(shù)據(jù)
        websocket.send(text);
    }
      //監(jiān)聽連接關(guān)閉
//    websocket.onclose = function (evt) {
//        console.log("Disconnected");
//    };

    //onmessage 監(jiān)聽服務(wù)器數(shù)據(jù)推送
    websocket.onmessage = function (evt) {
        msg.innerHTML += evt.data +'<br>';
//        console.log('Retrieved data from server: ' + evt.data);
    };
//監(jiān)聽連接錯(cuò)誤信息
//    websocket.onerror = function (evt, e) {
//        console.log('Error occured: ' + evt.data);
//    };

</script>
</html>

websocket API 手冊:
https://developer.mozilla.org/en-US/docs/Web/API/WebSocket

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市占婉,隨后出現(xiàn)的幾起案子泡嘴,更是在濱河造成了極大的恐慌,老刑警劉巖锐涯,帶你破解...
    沈念sama閱讀 222,865評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件磕诊,死亡現(xiàn)場離奇詭異,居然都是意外死亡纹腌,警方通過查閱死者的電腦和手機(jī)霎终,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來升薯,“玉大人莱褒,你說我怎么就攤上這事∠雅” “怎么了广凸?”我有些...
    開封第一講書人閱讀 169,631評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蛛枚。 經(jīng)常有香客問我谅海,道長,這世上最難降的妖魔是什么蹦浦? 我笑而不...
    開封第一講書人閱讀 60,199評(píng)論 1 300
  • 正文 為了忘掉前任扭吁,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘侥袜。我一直安慰自己蝌诡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評(píng)論 6 398
  • 文/花漫 我一把揭開白布枫吧。 她就那樣靜靜地躺著浦旱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪九杂。 梳的紋絲不亂的頭發(fā)上颁湖,一...
    開封第一講書人閱讀 52,793評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音尼酿,去河邊找鬼爷狈。 笑死,一個(gè)胖子當(dāng)著我的面吹牛裳擎,可吹牛的內(nèi)容都是我干的涎永。 我是一名探鬼主播,決...
    沈念sama閱讀 41,221評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼鹿响,長吁一口氣:“原來是場噩夢啊……” “哼羡微!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起惶我,我...
    開封第一講書人閱讀 40,174評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤妈倔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后绸贡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盯蝴,經(jīng)...
    沈念sama閱讀 46,699評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評(píng)論 3 343
  • 正文 我和宋清朗相戀三年听怕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捧挺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,918評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡尿瞭,死狀恐怖闽烙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情声搁,我是刑警寧澤黑竞,帶...
    沈念sama閱讀 36,573評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站疏旨,受9級(jí)特大地震影響很魂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜檐涝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評(píng)論 3 336
  • 文/蒙蒙 一莫换、第九天 我趴在偏房一處隱蔽的房頂上張望霞玄。 院中可真熱鬧骤铃,春花似錦拉岁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至撕瞧,卻和暖如春陵叽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背丛版。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評(píng)論 1 274
  • 我被黑心中介騙來泰國打工巩掺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人页畦。 一個(gè)月前我還...
    沈念sama閱讀 49,364評(píng)論 3 379
  • 正文 我出身青樓胖替,卻偏偏與公主長得像,于是被迫代替她去往敵國和親豫缨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子独令,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • WebSocket簡介 談到Web實(shí)時(shí)推送,就不得不說WebSocket好芭。在WebSocket出現(xiàn)之前燃箭,很多網(wǎng)站為...
    吧啦啦小湯圓閱讀 8,156評(píng)論 15 75
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)舍败,斷路器招狸,智...
    卡卡羅2017閱讀 134,719評(píng)論 18 139
  • websocket Websocket只是一個(gè)網(wǎng)絡(luò)通信協(xié)議就像 http、ftp等都是網(wǎng)絡(luò)通信的協(xié)議邻薯;不要多想裙戏;相...
    西嶺老濕閱讀 28,957評(píng)論 30 65
  • 在洛陽這個(gè)地方已經(jīng)生活了兩年多,現(xiàn)在正在第三個(gè)年頭上游走著弛说。過去的那些日子挽懦,盡管我的大學(xué)生活不如別人那般異常地豐富...
    楓楊林林閱讀 507評(píng)論 0 1
  • 我在夏天認(rèn)識(shí)你,卻又在夏天失去你木人。 一年前的夏天信柿,某個(gè)無聊的下午,我喝著汽水打開了QQ附近人上下劃著界面醒第,過了一會(huì)...
    smile_淺瀟閱讀 432評(píng)論 0 0