2017-04-03 2 views
0

Ich benutze rachetphp, um einen Client für einen API-Server zu erstellen. Aber ich habe ein Problem, wenn meine Verbindung schließen, was auch immer der Grund ist, kann ich nicht automatisch wieder verbinden.Wie man einen Klienten automatisch auf ratchetphp wieder schließt?

hier die lib i verwenden: 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(); 

ich nach einer Verbindung schließt alle Sekunden ein Reconnect versuchen möchte. Irgendwelche Ideen?

Antwort

2

Die Idee ist einfach, aber es braucht etwas Refactoring. Wir müssen den Wiederverbindungscode in den Handler einfügen, der ausgeführt wird, wenn die Verbindung geschlossen wird. Um das zu tun, übergeben wir die $app Funktion in sich selbst.

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(); 

Die Idee ist, dass, wenn die Verbindung der close Ereignis empfängt machen wir einen Reconnect mit der connectToServer Funktion:

$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

Very nice! damit kann ich nach einem 'error' too oder einem 'close' event wieder verbinden. – LordSoldier

Verwandte Themen