2017-04-03 23 views
0

저는 rachetphp를 사용하여 API 서버용 클라이언트를 만듭니다. 하지만 문제가 생겼습니다. 연결이 닫히면 이유가 무엇이든 자동으로 다시 연결할 수 없습니다. ratchetphp에서 클라이언트를 자동으로 다시 연결하는 방법은 무엇입니까?

여기 LIB는 내가 사용 https://github.com/ratchetphp/Pawl

<?php 

require __DIR__ . '/vendor/autoload.php'; 

$loop = React\EventLoop\Factory::create(); 
$connector = new Ratchet\Client\Connector($loop); 

$connector('ws://127.0.0.1:9000', ['protocol1', 'subprotocol2'], ['Origin' => 'http://localhost']) 
->then(function(Ratchet\Client\WebSocket $conn) { 
    $conn->on('message', function(\Ratchet\RFC6455\Messaging\MessageInterface $msg) use ($conn) { 
     echo "Received: {$msg}\n"; 
     $conn->close(); 
    }); 

    $conn->on('close', function($code = null, $reason = null) { 
     echo "Connection closed ({$code} - {$reason})\n"; 
    }); 

    $conn->send('Hello World!'); 
}, function(\Exception $e) use ($loop) { 
    echo "Could not connect: {$e->getMessage()}\n"; 
    $loop->stop(); 
}); 

$loop->run(); 

내가 연결 닫은 후 재 연결마다 초를 시도하고 싶습니다. 아이디어가 있으십니까?

답변

2

아이디어는 간단하지만 약간의 리팩토링이 필요합니다. 연결이 닫힐 때 실행되는 핸들러에 재접속 코드를 넣어야합니다. 그렇게하기 위해 우리는 $app 함수를 자기 안에 전달합니다.

require __DIR__ . '/vendor/autoload.php'; 

$loop = React\EventLoop\Factory::create(); 
$connector = new Ratchet\Client\Connector($loop); 

$app = function (Ratchet\Client\WebSocket $conn) use ($connector, $loop, &$app) { 
    $conn->on('message', function (\Ratchet\RFC6455\Messaging\MessageInterface $msg) use ($conn) { 
     echo "Received: {$msg}\n"; 
     $conn->close(); 
    }); 

    $conn->on('close', function ($code = null, $reason = null) use ($connector, $loop, $app) { 
     echo "Connection closed ({$code} - {$reason})\n"; 

     //in 3 seconds the app will reconnect 
     $loop->addTimer(3, function() use ($connector, $loop, $app) { 
      connectToServer($connector, $loop, $app); 
     }); 
    }); 

    $conn->send('Hello World!'); 
}; 

function connectToServer($connector, $loop, $app) 
{ 
    $connector('ws://127.0.0.1:9000', ['protocol1', 'subprotocol2'], ['Origin' => 'http://localhost']) 
     ->then($app, function (\Exception $e) use ($loop) { 
      echo "Could not connect: {$e->getMessage()}\n"; 
      $loop->stop(); 
     }); 
} 

connectToServer($connector, $loop, $app); 

$loop->run(); 

아이디어는 연결이 close 이벤트를 수신 할 때 우리는 connectToServer 기능을 사용하여 재 연결을 수행하는 것이 :

$conn->on('close', function ($code = null, $reason = null) use ($connector, $loop, $app) { 
    echo "Connection closed ({$code} - {$reason})\n"; 

    //in 3 seconds the app will reconnect 
    $loop->addTimer(3, function() use ($connector, $loop, $app) { 
     connectToServer($connector, $loop, $app); 
    }); 
}); 
+0

를 아주 좋은! 이걸로 나는 '오류'또는 '닫기'이벤트 후에 다시 연결할 수 있습니다. – LordSoldier