Beispiel #1
0
 public function start()
 {
     $addr = 'tcp://' . $this->config['ip'] . ':' . $this->config['port'];
     $this->socket = stream_socket_server($addr, $errno, $errstr);
     if (!$this->socket) {
         die("{$errstr} ({$errno})\n");
     }
     while (true) {
         //формируем массив прослушиваемых сокетов:
         $read = $write1 = $this->connects;
         $read[] = $write[] = $this->socket;
         $write = $except = $read1 = $except1 = null;
         if (!stream_select($read, $write, $except, null)) {
             //ожидаем сокеты доступные для чтения (без таймаута)
             break;
         }
         if (in_array($this->socket, $read)) {
             //есть новое соединение
             //принимаем новое соединение и производим рукопожатие:
             if (($connect = stream_socket_accept($this->socket, -1)) && ($info = $this->handshake($connect))) {
                 $this->connects[] = $connect;
                 //добавляем его в список необходимых для обработки
                 $this->onOpen($connect, $info);
                 //вызываем пользовательский сценарий
             }
             unset($read[array_search($this->socket, $read)]);
         }
         foreach ($read as $connect) {
             //обрабатываем все соединения
             $data = fread($connect, 10000);
             if (!strlen($data)) {
                 //соединение было закрыто
                 fclose($connect);
                 unset($this->connects[array_search($connect, $this->connects)]);
                 $this->onClose($connect);
                 //вызываем пользовательский сценарий
                 continue;
             } else {
                 stream_select($read1, $write1, $except1, null);
                 //var_dump($write1);
                 $this->onMessage($connect, $data);
                 //вызываем пользовательский сценарий
                 //unset($write1[ array_search($this->socket, $read) ]);
                 foreach ($write1 as $connect1) {
                     $senddata = SocketHelpers::decode($data);
                     if ($senddata['type'] === 'text') {
                         fwrite($connect1, SocketHelpers::encode($senddata['payload']));
                     }
                 }
             }
             //fwrite($connect, encode('Success'));
             //ожидаем сокеты доступные для чтения (без таймаута)
         }
     }
 }
Beispiel #2
0
 public function checkConnection()
 {
     $this->_connected = false;
     // send ping:
     $data = 'ping?';
     @fwrite($this->_Socket, SocketHelpers::encode($data, 'ping', true));
     $response = @fread($this->_Socket, 300);
     if (empty($response)) {
         return false;
     }
     $response = SocketHelpers::decode($response);
     if (!is_array($response)) {
         return false;
     }
     if (!isset($response['type']) || $response['type'] !== 'pong') {
         return false;
     }
     $this->_connected = true;
     return true;
 }