zoukankan      html  css  js  c++  java
  • HTML5_07之WebSocket

    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... ";

          $msgsock = socket_accept($sock);

          echo "Waiting for Request... ";

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

          echo "Request Received: $buf ";

          $response = hand_shake($buf);

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

          //正式开始通信...

          $buf = socket_read($msgsock, 8192);

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

              $msg = "WELCOME $i ";

              $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," ")));

          $new_key = base64_encode(sha1($key."258EAFA5-E914-47DA-95CA-C5AB0DC85B11",true));

          $new_message = "HTTP/1.1 101 Switching Protocols ";

          $new_message .= "Upgrade: websocket ";

          $new_message .= "Sec-WebSocket-Version: 13 ";

          $new_message .= "Connection: Upgrade ";

          $new_message .= "Sec-WebSocket-Accept: " . $new_key . " ";

          return $new_message;

      }

      function code($msg){

          $msg = preg_replace(array('/ $/','/ $/','/ $/',), '', $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;

      }

  • 相关阅读:
    关于jquery动态添加的新元素无法绑定事件那些事
    关于jquery获取json数据的格式问题
    beescms文章列表页函数学习
    beescms相关函数学习
    这是二零一四年十点整的广州
    POJ 1852 Ants 分析
    hiho_1114_扫雷
    hiho_1014_Trie_Tree
    排列组合
    用链表写的冒泡排序理解
  • 原文地址:https://www.cnblogs.com/Jupiter258/p/6064362.html
Copyright © 2011-2022 走看看