Example #1
0
 /**
  * @param $payload
  * @param string $type
  * @param bool $masked
  * @return bool|string
  */
 private function hybi10Encode($payload, $type = 'text', $masked = true)
 {
     $frameHead = array();
     $frame = '';
     $payloadLength = strlen($payload);
     switch ($type) {
         //文本内容
         case 'text':
             // first byte indicates FIN, Text-Frame (10000001):
             $frameHead[0] = 129;
             break;
             //二进制内容
         //二进制内容
         case 'binary':
         case 'bin':
             // first byte indicates FIN, Text-Frame (10000010):
             $frameHead[0] = 130;
             break;
         case 'close':
             // first byte indicates FIN, Close Frame(10001000):
             $frameHead[0] = 136;
             break;
         case 'ping':
             // first byte indicates FIN, Ping frame (10001001):
             $frameHead[0] = 137;
             break;
         case 'pong':
             // first byte indicates FIN, Pong frame (10001010):
             $frameHead[0] = 138;
             break;
     }
     // set mask and payload length (using 1, 3 or 9 bytes)
     if ($payloadLength > 65535) {
         $payloadLengthBin = str_split(sprintf('%064b', $payloadLength), 8);
         $frameHead[1] = $masked === true ? 255 : 127;
         for ($i = 0; $i < 8; $i++) {
             $frameHead[$i + 2] = bindec($payloadLengthBin[$i]);
         }
         // most significant bit MUST be 0 (close connection if frame too big)
         if ($frameHead[2] > 127) {
             $this->socket->close();
             return false;
         }
     } elseif ($payloadLength > 125) {
         $payloadLengthBin = str_split(sprintf('%016b', $payloadLength), 8);
         $frameHead[1] = $masked === true ? 254 : 126;
         $frameHead[2] = bindec($payloadLengthBin[0]);
         $frameHead[3] = bindec($payloadLengthBin[1]);
     } else {
         $frameHead[1] = $masked === true ? $payloadLength + 128 : $payloadLength;
     }
     // convert frame-head to string:
     foreach (array_keys($frameHead) as $i) {
         $frameHead[$i] = chr($frameHead[$i]);
     }
     // generate a random mask:
     $mask = array();
     if ($masked === true) {
         for ($i = 0; $i < 4; $i++) {
             $mask[$i] = chr(rand(0, 255));
         }
         $frameHead = array_merge($frameHead, $mask);
     }
     $frame = implode('', $frameHead);
     // append payload to frame:
     for ($i = 0; $i < $payloadLength; $i++) {
         $frame .= $masked ? $payload[$i] ^ $mask[$i % 4] : $payload[$i];
     }
     return $frame;
 }
Example #2
0
    public function TCP($ip, $port)
    {
        if ($this->server) {
            return $this->server;
        } else {
            $this->server = new swoole_server($ip, $port);
            return $this->server;
        }
    }
    public function run()
    {
        $this->server->on('connect', array($this, 'connect'));
        $this->server->on('receive', array($this, 'receive'));
        $this->server->on('close', array($this, 'close'));
        $this->server->start();
    }
    public function connect($serv, $fd)
    {
        echo "Client: Connect.\n";
    }
    public function receive($serv, $fd, $from_id, $data)
    {
        $this->server->send($fd, "Server: " . $data);
    }
    public function close($serv, $fd)
    {
        echo "Client: Close.\n";
    }
}
$server = new TCP('127.0.0.1', 9501);
$server->run();