最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Swoole實(shí)現(xiàn)PHP與websocket聊天室

 更新時(shí)間:2016年08月03日 16:43:28   作者:西嶺_  
本文利用Swoole來實(shí)現(xiàn)PHP+websocket的聊天室,過程介紹的很詳細(xì),對聊天室的開發(fā)很有幫助,有需要的可以參考學(xué)習(xí)。

websocket

Websocket只是一個(gè)網(wǎng)絡(luò)通信協(xié)議

就像 http、ftp等都是網(wǎng)絡(luò)通信的協(xié)議;不要多想;

相對于HTTP這種非持久的協(xié)議來說,Websocket是一個(gè)持久化網(wǎng)絡(luò)通信的協(xié)議;

WebSocket和HTTP的關(guān)系

有交集,但是并不是全部。

Websocket只是借用了HTTP的一部分協(xié)議來完成一次握手。(HTTP的三次握手,此處只完成一次)

http和websocket 請求頭對比:


HTTP:

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

WebSocket:

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

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


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

首先是 ajax輪詢 ,ajax輪詢的原理非常簡單,讓瀏覽器隔個(gè)幾秒就發(fā)送一次請求,詢問服務(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的每一次請求與響應(yīng)結(jié)束后,服務(wù)器將客戶端信息全部丟棄,下次請求,必須攜帶身份信息(cookie),無狀態(tài)性;

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

所以上面的情景可以做如下修改。

客戶端:啦啦啦,我要建立Websocket協(xié)議,需要的服務(wù):chat,Websocket協(xié)議版本:17(HTTP Request)

服務(wù)端:ok,確認(rèn),已升級為Websocket協(xié)議(HTTP Protocols Switched)

客戶端:麻煩你有信息的時(shí)候推送給我噢。。

服務(wù)端:ok,有的時(shí)候會(huì)告訴你的。

客戶端:balab開始斗圖alabala

服務(wù)端:蒼井空ala

客戶端:流鼻血了,我擦……

服務(wù)端:哈哈布爾教育牛逼啊哈哈哈哈

服務(wù)端:笑死我了哈哈

Swoole

但是,為了用PHP配合HTML5完成一次WebSocket請求和響應(yīng),哥走過千山萬水,在密林深處,發(fā)現(xiàn)了Swoole :

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ù)器對象,監(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對象建立連接:
  //參數(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>

以上就是基于Swoole實(shí)現(xiàn)PHP與websocket聊天室的全部內(nèi)容,相信本文對大家學(xué)習(xí)PHP和websocket及開發(fā)聊天室很有幫助。

相關(guān)文章

  • Laravel使用Queue隊(duì)列的技巧匯總

    Laravel使用Queue隊(duì)列的技巧匯總

    這篇文章主要給大家介紹了關(guān)于Laravel使用Queue隊(duì)列技巧的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Laravel具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • php連接mssql數(shù)據(jù)庫的幾種方法

    php連接mssql數(shù)據(jù)庫的幾種方法

    數(shù)據(jù)庫查詢不外乎4個(gè)步驟,1、建立連接。2、輸入查詢代碼。3、建立查詢并取出數(shù)據(jù)。4、關(guān)閉連接。 php連接mssql數(shù)據(jù)庫有幾個(gè)注意事項(xiàng),尤其mssql的多個(gè)版本、32位、64位都有區(qū)別。
    2013-02-02
  • Yii框架實(shí)現(xiàn)郵箱激活的方法【數(shù)字簽名】

    Yii框架實(shí)現(xiàn)郵箱激活的方法【數(shù)字簽名】

    這篇文章主要介紹了Yii框架實(shí)現(xiàn)郵箱激活的方法,基于郵箱發(fā)送郵件實(shí)現(xiàn)數(shù)字簽名的激活功能,需要的朋友可以參考下
    2016-10-10
  • php的declare命令及用法詳解

    php的declare命令及用法詳解

    declare是用來設(shè)定一段代碼的執(zhí)行指令,declare結(jié)構(gòu)用于全局范圍,影響到其后的所有代碼,今天小編給大家普及php的declare命令及用法知識,感興趣的朋友一起看看吧
    2021-06-06
  • php加水印的代碼(支持半透明透明打水印,支持png透明背景)

    php加水印的代碼(支持半透明透明打水印,支持png透明背景)

    一個(gè)簡單的打水印代碼(圖片水?。С炙⊥该鞫仍O(shè)置,也支持png透明背景格式圖片打水印
    2013-01-01
  • php中g(shù)et_headers函數(shù)的作用及用法的詳細(xì)介紹

    php中g(shù)et_headers函數(shù)的作用及用法的詳細(xì)介紹

    本篇文章介紹了,在php中g(shù)et_headers函數(shù)的作用及用法。需要的朋友參考下
    2013-04-04
  • php jsonp單引號轉(zhuǎn)義

    php jsonp單引號轉(zhuǎn)義

    JSONP(JSON with Padding)是一個(gè)非官方的協(xié)議,他的實(shí)現(xiàn)方式大致就是:讓客戶端決定要回調(diào)的Javascript函數(shù)名,在第三方服務(wù)端將 JSON 數(shù)據(jù)拼裝到回調(diào)函數(shù)名中,返回的就是參數(shù)為JSON數(shù)據(jù)的函數(shù)調(diào)用腳本,瀏覽器加載腳本并執(zhí)行達(dá)到獲取第三方數(shù)據(jù)的目的。
    2014-11-11
  • ThinkPHP結(jié)合ajax、Mysql實(shí)現(xiàn)的客戶端通信功能代碼示例

    ThinkPHP結(jié)合ajax、Mysql實(shí)現(xiàn)的客戶端通信功能代碼示例

    這篇文章主要介紹了ThinkPHP結(jié)合ajax、Mysql實(shí)現(xiàn)的客戶端通信功能,需要的朋友可以參考下
    2014-06-06
  • php生成短網(wǎng)址示例

    php生成短網(wǎng)址示例

    這篇文章主要介紹了php生成短網(wǎng)址示例,需要的朋友可以參考下
    2014-05-05
  • thinkPHP框架通過Redis實(shí)現(xiàn)增刪改查操作的方法詳解

    thinkPHP框架通過Redis實(shí)現(xiàn)增刪改查操作的方法詳解

    這篇文章主要介紹了thinkPHP框架通過Redis實(shí)現(xiàn)增刪改查操作的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了thinkPHP框架針對redis數(shù)據(jù)庫的配置、連接及CURD操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-05-05

最新評論

平利县| 灌云县| 荆州市| 肇州县| 成安县| 临沧市| 咸阳市| 合山市| 新郑市| 定西市| 龙岩市| 玉龙| 纳雍县| 马鞍山市| 确山县| 错那县| 元江| 霍州市| 芦山县| 嘉峪关市| 宁国市| 若羌县| 八宿县| 白河县| 靖西县| 西宁市| 贞丰县| 汝阳县| 如东县| 巨鹿县| 凌海市| 乃东县| 津市市| 白山市| 丰城市| 宣城市| 屏东市| 永年县| 丹棱县| 昌平区| 蓝田县|