坑爹的WebSocket

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

焦头烂额两天之久的花落悠然撰文

登录后才可评论.