一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - PHP教程 - 基于Swoole實現(xiàn)PHP與websocket聊天室

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

2021-02-21 15:36西嶺_ PHP教程

本文利用Swoole來實現(xiàn)PHP+websocket的聊天室,過程介紹的很詳細(xì),對聊天室的開發(fā)很有幫助,有需要的可以參考學(xué)習(xí)。

websocket

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

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

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

websocket和http的關(guān)系

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

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

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

http和websocket 請求頭對比:

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

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

http:

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

websocket:

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

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

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

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

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

首先是 ajax輪詢 ,ajax輪詢的原理非常簡單,讓瀏覽器隔個幾秒就發(fā)送一次請求,詢問服務(wù)器是否有新信息

場景再現(xiàn):

客戶端:啦啦啦,有沒有新信息(request)

服務(wù)端:沒有(response)

客戶端:啦啦啦,有沒有新信息(request)

服務(wù)端:沒有。。(response)

客戶端:啦啦啦,有沒有新信息(request)

服務(wù)端:你好煩啊,沒有啊。。(response)

客戶端:啦啦啦,有沒有新消息(request)

服務(wù)端:好啦好啦,有啦給你。(response)

客戶端:啦啦啦,有沒有新消息(request)

服務(wù)端:。。。沒。。。。沒。。沒有

long poll 其實原理跟 ajax輪詢 差不多,都是采用輪詢的方式,不在論述;

從上面可以看出,輪詢其實就是在不斷地建立http連接,然后等待服務(wù)端處理,可以體現(xiàn)http協(xié)議的另外一個特點,被動性。同時,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)

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

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

客戶端: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,消息隊列,毫秒定時器,異步文件讀寫,異步dns查詢。

支持的服務(wù):

httpserver

websocket server

tcp server

tcp client

async-io(異步)

task(定時任務(wù))

環(huán)境依賴:

僅支持linux,freebsd,macos,3類操作系統(tǒng)

linux內(nèi)核版本2.3.32以上

php5.3.10以上版本

gcc4.4以上版本或者clang

cmake2.4+,編譯為libswoole.so作為c/c++庫時需要使用cmake

安裝:

必須保證系統(tǒng)中有以下這些軟件:

php-5.3.10 或更高版本

gcc-4.4 或更高版本

make

autoconf

swoole是作為php擴(kuò)展來運行的

安裝(root權(quán)限):

cd swoole

phpize

./configure

make

sudo make install

配置php.ini

extension=swoole.so

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

做一個聊天室

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//創(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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<!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)聽連接錯誤信息
//  websocket.onerror = function (evt, e) {
//    console.log('error occured: ' + evt.data);
//  };
 
</script>
</html>

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

原文鏈接:http://www.jianshu.com/p/fedbb9d2d999

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 天天av天天翘天天综合网 | 小sao货ji巴cao死你视频 | 红怡院欧洲 | 亚洲第一色区 | 羞羞视频免费观看网站 | 国产伦精品一区二区 | 国产精品特黄毛片 | free性丰满hd性欧美人体 | 日本成人高清视频 | 美女扒开腿让男生桶爽漫画 | 无套暴躁白丝秘书 | 亚洲黄色成人 | 边摸边吃奶边做爽gif动态图 | 草莓视频幸福宝 | 国产视频分类 | 国产精品青青在线观看香蕉 | 国产男女乱淫真视频全程播放 | 韩国丽卡三级作品 | 久久成人免费大片 | 久久成人a毛片免费观看网站 | 福利一区三区 | avtt天堂在线 | 欧美不卡一区二区三区 | 人人人人人看碰人人免费 | 日产乱码卡1卡2卡三卡四在线 | 和两个男人玩3p好爽视频 | 成人尤物| 视频大全在线观看网址 | 国产91一区二区在线播放不卡 | 免费观看视频在线播放 | 摄像头东北对白清晰 | 亚洲天堂在线视频播放 | 精品女同一区二区三区免费站 | 精品乱lun小说 | 亚洲视频在线一区二区三区 | 亚洲国产精品成人综合久久久 | 啪啪无尽3d动漫漫画免费网站 | 国产成年人视频 | 久久精品国产亚洲AV天美18 | 小SAO货叫大声点妓女 | 欧美ggg666 |