PHP原生socket与Websocket握手、解码、加码

本文阅读 1 分钟
首页 PHP笔记 正文
  1. <?php
  2. class WsXy{
  3. public function getHeaders($req)
  4. {
  5. $r = $h = $o = null;
  6. if(preg_match("/GET (.*) HTTP/" , $req, $match))
  7. $r = $match[1];
  8. if(preg_match("/Host: (.*)\r\n/" , $req, $match))
  9. $h = $match[1];
  10. if(preg_match("/Origin: (.*)\r\n/", $req, $match))
  11. $o = $match[1];
  12. if(preg_match("/Sec-WebSocket-Key: (.*)\r\n/", $req, $match))
  13. $key = $match[1];
  14. return array($r, $h, $o, $key);
  15. }
  16. public function wrap($msg="")
  17. {
  18. $a = str_split($msg, 125);
  19. if (count($a) == 1) {
  20. return "\x81" . chr(strlen($a[0])) . $a[0];
  21. }
  22. $ns = "";
  23. foreach ($a as $o) {
  24. $ns .= "\x81" . chr(strlen($o)) . $o;
  25. }
  26. return $ns;
  27. }
  28. public function doHandShake($socket, $buffer)
  29. {
  30. $this->log($buffer);
  31. list($resource, $host, $origin, $key) = $this->getHeaders($buffer);
  32. //websocket version 13
  33. $acceptKey = base64_encode(sha1($key . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11', true));
  34. $upgrade = "HTTP/1.1 101 Switching Protocol\r\n" .
  35. "Upgrade: websocket\r\n" .
  36. "Connection: Upgrade\r\n" .
  37. "Sec-WebSocket-Accept: " . $acceptKey . "\r\n\r\n"; //必须以两个回车结尾
  38. $this->log($upgrade);
  39. socket_write($socket, $upgrade, strlen($upgrade));
  40. return true;
  41. }
  42. public function unwrap($buffer="")
  43. {
  44. $decoded = "";
  45. $len = ord($buffer[1]) & 127;
  46. if ($len === 126) {
  47. $masks = substr($buffer, 4, 4);
  48. $data = substr($buffer, 8);
  49. } else if ($len === 127) {
  50. $masks = substr($buffer, 10, 4);
  51. $data = substr($buffer, 14);
  52. } else {
  53. $masks = substr($buffer, 2, 4);
  54. $data = substr($buffer, 6);
  55. }
  56. for ($index = 0; $index < strlen($data); $index++) {
  57. $decoded .= $data[$index] ^ $masks[$index % 4];
  58. }
  59. return $decoded;
  60. }
  61. public function disconnect($clientSocket)
  62. {
  63. socket_close($clientSocket);
  64. }
  65. public function log($vars)
  66. {
  67. var_dump($vars);
  68. }
  69. }
解压密码: detechn或detechn.com

免责声明

本站所有资源出自互联网收集整理,本站不参与制作,如果侵犯了您的合法权益,请联系本站我们会及时删除。

本站发布资源来源于互联网,可能存在水印或者引流等信息,请用户自行鉴别,做一个有主见和判断力的用户。

本站资源仅供研究、学习交流之用,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担。

php 读取base64到网页显示并存到新文件
« 上一篇 03-30
基于redis+mysql+php的简单微信服务号通知队列
下一篇 » 04-04

发表评论

1 条回复
  1. 文章不错支持一下吧

惪特博客
  • 文章总数:
    18498 篇
  • 评论总数:
    53264 条
  • 标签总数:
    8869 个
  • 总浏览量:
    21816992 次
  • 最后更新:
    6天前

最多点赞

随便看看

标签TAG