google開放webrtc的源碼引起了業界的一陣旋風, 花落思考了一下, 瀏覽器從文字到圖片到視頻, 最後到實時視頻似乎是一個必然的趨 勢. 曾經, 大家習慣的media player已經被youtube, 土豆所代替, 大部分人不再對下載視頻然後觀看感興趣. 同樣, 想必日後skype, QQ什麽的也將被網頁視頻聊天所取代.
花落於是打算研究研究webrtc.
本地視頻流頗easy, 等到開始連接peerconnection時遇到了麻煩. signaling channel. 各處資料都語焉不詳, 說是可以用httprequest, websocket, 甚至是email, 問一計算機天才, 答曰”信鴿”, 花落砰地摔倒在地.
好吧, 雙向通訊不是嗎? 選擇websocket吧, html5的新feature, 很火啊, 研究明白了花落就可以做個聊天室啦.
問題是網上搜到的資料都是舊的, websocket協議更新以後, client端發送的header格式改變了, 將最新的handshake代碼帖在下麵, 如有遇到同樣問題的朋友可以參考一下.
操作係統: windows 7
瀏覽器: chrome canary 24
function dohandshake($user, $buffer) {
if (preg_match(“/GET (.*) HTTP/”, $buffer, $match)) {
$r = $match[1];
}
if (preg_match(“/Host: (.*)rn/”, $buffer, $match)) {
$h = $match[1];
}
if (preg_match(“/Origin: (.*)rn/”, $buffer, $match)) {
$o = $match[1];
}
if (preg_match(“/Sec-WebSocket-Key: (.*)rn/”, $buffer, $match)) {
$k = $match[1];
}
$accept_key = base64_encode(pack(‘H*’, sha1($k . ’258EAFA5-E914-47DA-95CA-C5AB0DC85B11′)));
$response = “HTTP/1.1 101 Switching Protocolsrn”;
$response .= “Upgrade: websocketrn”;
$response .= “Connection: Upgradern”;
$response .= “Sec-WebSocket-Accept: ” . $accept_key . “rn”;
$response .= “rn”;
socket_write($user->socket, $response, strlen($response));
$user->handshake = true;
return true;
}
發送和接收消息也有編碼, 同樣找不到文檔資料, 花落找到一個巨牛的網站, 裏麵的程序可用, 包括上麵的handshake, encode和decode. 代碼在此.
https://github.com/lemmingzshadow/php-websocket/blob/master/server/lib/WebSocket/Connection.php
焦頭爛額兩天之久的花落悠然撰文