### 概述
websocket是html5提出的一個 協議 規范,由html5提供一種瀏覽器和服務器之間的全雙工通信網絡技術。
Websocket通信協議與2011年被IETF定為標準RFC 6455,Websocket Api被W3C定為標準。
全雙工,是通訊傳輸的一個術語,通信允許數據在兩個方向上同時傳輸。相當于高速公路或打電話。
單工或半雙工,是指一個時間段內只有一個動作發生。相當于汽車單行道或對講機
協議名:ws
### WebSocket優越性
以前不管使用HTTP輪詢或使用TCP長連接等方式制作即實消息系統,都有著天然的缺陷,隨著HTML5的興起,其
中有一個新的協議Websocket Protocol,可以實現瀏覽器與服務器全雙工通信,它可以做到:通過一個握手的機
制,客戶端(瀏覽器)和服務器(webserver)之間能建立一個類似tcp的連接,從而方便【客戶端】-【服務
端】之間的通信。兩者之是就直接可以數據互相傳送,這個新的協議的特點正好適合這種即時通信 .
### Websocket協議實現方式:
它是一長鏈接,只能通過一次請求來初始化鏈接,然后所有的請求和響應都是通過這個連接進行通訊,這意味著它
是一種基于事件驅動,異步的消息機制。只需要一個握手動作,就可以形成一條快速的通道.
### 握手協議
在實現websocket連線過程中,需要通過瀏覽器發出websocket連線請求,然后服務器發出回應,這個過程通常稱為“握手” (handshaking) .

### 瀏覽器發送請求
因為websocket已是html5自身就有可以在js中直接實例化來使用 .
~~~
var webSocket = new WebSocket("ws://localhost:9000")
~~~
### 服務端返回請求
在websocket協議規范中規定,Sec-WebSocket-Version大于等于13之后加密返回的Sec-WebSocket-Accept將進行如下的操作 :
GUID(協議規定的一個固定值):258EAFA5-E914-47DA-95CA-C5AB0DC85B11
加密過程 :
客戶端上報的Sec-WebSocket-Key的值拼接上GUID【258EAFA5-E914-47DA-95CA-C5AB0DC85B11】,拿這個字符串做sha1計算,然后再把得到的結果通過base64加密,最后再返回給客戶端 .
~~~
base64_encode(sha1("2SCVXUeP9cTjV+0mWB8J6A==" . "258EAFA5‐E914‐47DA‐95CA‐C5AB0DC85B11"), true));
~~~
Sec-WebSocket-Key此值需要通過如正則來獲取
~~~
/**
* @param $header 客戶端頭信息
* @param $activeSocket 客戶端的socket對象
*/
function handshaking($header, $activeSocket) {
preg_match("/Sec\‐WebSocket\‐Key:\ (.+)\r\n/", $header, $matchs);
$key = base64_encode(sha1($matchs[1] . "258EAFA5‐E914‐47DA‐95CA‐C5AB0DC85B11", true));
$head = "HTTP/1.1 101 Switching Protocols\r\n";
$head .= "Upgrade: websocket\r\n"; // 告訴這個websocket客戶端可以把這個協議升級為websocket協議
$head .= "Connection: Upgrade\r\n"; // 升級這個通信協議
$head .= "Sec‐WebSocket‐Accept: {$key}\r\n\r\n"; // 最后的一定要有兩個回車
// 握手響應協議信息返回給瀏覽器
socket_write($activeSocket, $head);
}
~~~
完成此步驟,瀏覽器和服務器之間的握手操作就完成,后就可以進行相互的通信操作。
- PHP加密技術
- md5加密
- Crypt加密
- 函數
- 概述
- 強類型參數
- 可變參數列表
- 值傳遞&引用傳遞
- 變量作用域
- 可變函數
- 嵌套函數
- 遞歸函數
- 匿名函數(閉包)
- 面向對象
- 概念
- 類
- 對象的傳值
- 對象的克隆
- 構造方法
- 析構方法
- 克隆方法
- $this
- 類常量
- 靜態屬性
- 靜態方法
- 繼承
- 重寫
- 重載
- 概述
- 屬性重載
- 概述
- __set()
- __get()
- __unset()
- __isset()
- 方法重載
- 概述
- __call()
- __callstatic()
- 封裝
- 最終類
- 抽象類
- 接口
- 對象的序列化與反序列化
- __sleep()
- __wakeup()
- 其他魔術方法
- 對象的遍歷
- 類和對象相關函數
- 錯誤
- 概述
- 設置錯誤級別
- trigger_error()觸發錯誤
- 處理PHP中的錯誤
- 異常
- 概述
- 自定義異常類
- 自定義文件寫入異常類
- 記錄和發送異常信息
- 使用觀察者模式處理異常信息
- 自定義異常處理器
- 設計模式
- 創建型
- 單例模式
- 工廠模式
- 原型模式
- 結構型
- 注冊樹模式
- 適配器模式
- 數據映射模式
- 裝飾器模式
- 代理模式
- 行為型
- 策略模式
- 觀察者模式
- 迭代器模式
- 網絡
- cURL
- Oauth2.0
- QQ第三方登錄
- TCP/IP協議
- 概述
- HTTP協議
- 概述
- HTTP請求協議
- HTTP響應協議
- WebSocket
- 安裝擴展
- Redis
- Socket
- 計算機通信
- socket簡介
- PHP操作socket
- TCP
- HTTP服務端
- WebSocket
- PHP7
- 生成器yield
- 異常finally
- CGI和FPM
- php有用命令
- 內存