博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HTML5_07之WebSocket
阅读量:5030 次
发布时间:2019-06-12

本文共 2013 字,大约阅读时间需要 6 分钟。

1、HTML5新特性之WebSocket:

 ①HTTP协议的不足:基于“请求——响应”模型,只有在客户端发送请求后,服务器才会给予响应;对于实时的股票走势图,以及聊天通讯等无法满足需求;
 ②解决方案:setInterval+AJAX:心跳请求;
  问题:过于频繁对服务器压力过大,频率过低则信息获取延迟;
 ③最佳解决方案——WebSocket协议:
  基于“广播——收听”模型,客户端连接到服务器后不再断开,服务器有了消息随时发送给客户端,客户端也可以不停地给服务器发送消息;
  不足:客户端和服务器是永久连接,服务器端可容纳的连接数是有限的;
 ④WebSocket应用需要服务器端和客户端都使用WebSocket协议;
 ⑤socket_server.php:

<?php

  $address = "127.0.0.1";

  $port = 9999; //调试的时候,可以多换端口来测试程序!

  set_time_limit(0);

  $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

  socket_set_block($sock);

  socket_bind($sock, $address, $port);

  socket_listen($sock, 4);

 

  do

  {

      echo "Waiting for Connection...\n";

      $msgsock = socket_accept($sock);

      echo "Waiting for Request...\n";

      $buf = socket_read($msgsock, 8192);     //读取请求

      echo "Request Received: $buf\n";

      $response = hand_shake($buf);

      socket_write($msgsock,$response,strlen($response)); //发送响应

      //正式开始通信...

      $buf = socket_read($msgsock, 8192);

      for($i=0; $i<5; $i++){

          $msg = "WELCOME $i\n";

          $msg = code($msg);

          sleep(1);

          socket_write($msgsock, $msg, strlen($msg));

      }

      socket_close($msgsock);

  } while (true);

  socket_close($sock);

 

  function hand_shake($buf){

      $buf  = substr($buf,strpos($buf,'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";

      return $new_message;

  }

  function code($msg){

      $msg = preg_replace(array('/\r$/','/\n$/','/\r\n$/',), '', $msg);

      $frame = array();

      $frame[0] = '81';

      $len = strlen($msg);

      $frame[1] = $len<16?'0'.dechex($len):dechex($len);

      $frame[2] = ord_hex($msg);

      $data = implode('',$frame);

      return pack("H*", $data);

  }

  function ord_hex($data)  {

      $msg = '';

      $l = strlen($data);

      for ($i= 0; $i<$l; $i++) {

          $msg .= dechex(ord($data{$i}));

      }

      return $msg;

  }

 

转载于:https://www.cnblogs.com/Jupiter258/p/6064362.html

你可能感兴趣的文章
[Leetcode] DP-- 474. Ones and Zeroes
查看>>
80X86寄存器详解<转载>
查看>>
c# aop讲解
查看>>
iterable与iterator
查看>>
返回顶部(动画)
查看>>
webpack+react+antd 单页面应用实例
查看>>
Confluence 6 SQL Server 数据库驱动修改
查看>>
Confluence 6 通过 SSL 或 HTTPS 运行 - 备注和问题解决
查看>>
【47.76%】【Round #380B】Spotlights
查看>>
CSS3的文字阴影—text-shadow
查看>>
Nginx配置实验反向代理
查看>>
数据类型的判断
查看>>
JAVA记录-IntelliJ Idea 2017 免费激活方法(转载)
查看>>
Git(使用码云)
查看>>
分享Java web 开发必游之路
查看>>
IIS初始化(预加载),解决第一次访问慢,程序池被回收问题(转载)
查看>>
Bean的Scope
查看>>
【BZOJ】3142: [Hnoi2013]数列
查看>>
http初探
查看>>
W3C标准以及规范
查看>>