iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 24
0
自我挑戰組

挑戰30天完成PHP聊天室範例系列 第 24

[Day24]第二十三章-盤古開天(十一)-WEBSOCKET SERVER端(5)

  • 分享至 

  • xImage
  •  

接續上一篇,
還沒處理完傳送訊息的部分,
之後會用到4個自訂函數
woshou()-握手用
send()
send1()
send2()

先來說握手的部分,
握手必須照協議组合進行訊息返回,
有些程式語言不需要自己建立就有內建,
而這邊我們是自己處理,
websocket握手的介紹前面篇章說過就不再提,
實做如下:

 /*
  * 函數說明:對client的請求進行回應,即握手操作
  * @$k clien的socket對應的鍵,即每個用戶有唯一$k並對應socket
  * @$buffer 接收client請求的所有訊息
  */
  function woshou($k,$buffer){

    //截取Sec-WebSocket-Key的值並加密
    $buf = substr($buffer,strpos($buffer,'Sec-WebSocket-Key:')+18);

    $key = trim(substr($buf,0,strpos($buf,"\r\n")));
    $new_key = base64_encode(sha1($key."258EAFA5-E914-47DA-95CA-C5AB0DC85B11",true));

    //按照協議组合訊息進行返回
    $new_message = "HTTP/1.1 101 Switching Protocols\r\n";
    $new_message .= "Upgrade: websocket\r\n";
    $new_message .= "Sec-WebSocket-Version: 13\r\n";
    $new_message .= "Connection: Upgrade\r\n";
    $new_message .= "Sec-WebSocket-Accept: " . $new_key . "\r\n\r\n";
    socket_write($this->users[$k]['socket'],$new_message,strlen($new_message));

    //對已經握手的client做標記
    $this->users[$k]['shou']=true;
    return true;

  }

剩下三個我們下一篇章談~


上一篇
[Day23]第二十二章-盤古開天(十)-WEBSOCKET SERVER端(4)
下一篇
[Day25]第二十四章-盤古開天(十二)-WEBSOCKET SERVER端(6)
系列文
挑戰30天完成PHP聊天室範例30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言