tutorial - websocket php y html5
¿Puede Ratchet WebSocket Server enviar un mensaje al propio cliente? (3)
Eso es de hecho posible. Necesita comunicarse con el proceso del servidor WebSocket de alguna manera. Puede hacerlo utilizando algún tipo de paso de mensajes, ya sea RPC o una cola de mensajes.
Ratchet se basa en el bucle de eventos React. Esto significa que cualquier forma de comunicación con Ratchet debe estar integrada con ese bucle de eventos. En la página de inicio de React puede ver algunas de las integraciones que ya existen:
- Predis/Async (puede usar redis pub / sub para pasar mensajes)
- DNode-PHP (dnode es un protocolo RPC basado en TCP)
- React/ZMQ (integra el bucle de eventos con ZeroMQ )
- React/Stomp (implementación del protocolo STOMP, que le permite hablar con un mensaje como RabbitMQ )
- JCook21/ReactAMQP (enlaces AMQP para React PHP)
En la documentación de Ratchet hay un tutorial sobre cómo usar React / ZMQ para enviar mensajes desde cualquier lugar a su servidor WebSocket.
Quiero usar un trinquete ( http://socketo.me ) para la conexión permanente entre las aplicaciones del iPhone y el servidor. Y necesito intercambiar datos entre las aplicaciones y el servidor.
De este ejemplo ( http://socketo.me ) descubrí que tengo una función enMessage que se activará cuando la aplicación envíe un mensaje al servidor y el servidor podría enviar una respuesta a la aplicación.
Pero el servidor también debe tener la capacidad de enviar datos a la aplicación sin obtener datos de la aplicación. Por ejemplo, se ha establecido la conexión entre la aplicación y el servidor. Algo sucedió en el servidor y necesitamos enviar una nueva información a la aplicación. ¿Cómo puedo hacerlo y es posible?
La pregunta principal es ¿cómo puedo enviar datos a la aplicación desde el servidor?
Gracias por cualquier ayuda.
Ratchet también implementa WAMP , que incluye PubSub. Por lo tanto, sus clientes pueden suscribirse a algunos temas, y puede hacer que otros clientes (que se ejecutan, por ejemplo, en su infraestructura de back-end), publiquen en esos temas. Es posible que tenga un cliente basado en AutobahnPython a través de Ratchet a una aplicación móvil basada en AutobahnAndroid o un cliente HTML5 basado en AutobahnJS.
Tuve exactamente la misma pregunta y aquí está lo que hice.
Basado en el http://socketo.me , he sustituido SplObjectStorage con una matriz. Antes de presentar mis modificaciones, me gustaría comentar que si siguió ese tutorial y lo entendió, lo único que le impidió llegar a esta solución es que probablemente no sepa qué es SplObjectStorage .
class Chat implements MessageComponentInterface {
protected $clients;
public function __construct() {
$this->clients = array();
}
public function onOpen(ConnectionInterface $conn) {
// Store the new connection to send messages to later
$this->clients[$conn->resourceId] = $conn;
echo "New connection! ({$conn->resourceId})/n";
}
public function onMessage(ConnectionInterface $from, $msg) {
$numRecv = count($this->clients) - 1;
echo sprintf(''Connection %d sending message "%s" to %d other connection%s'' . "/n"
, $from->resourceId, $msg, $numRecv, $numRecv == 1 ? '''' : ''s'');
foreach ($this->clients as $key => $client) {
if ($from !== $client) {
// The sender is not the receiver, send to each client connected
$client->send($msg);
}
}
// Send a message to a known resourceId (in this example the sender)
$client = $this->clients[$from->resourceId];
$client->send("Message successfully sent to $numRecv users.");
}
public function onClose(ConnectionInterface $conn) {
// The connection is closed, remove it, as we can no longer send it messages
unset($this->clients[$conn->resourceId]);
echo "Connection {$conn->resourceId} has disconnected/n";
}
public function onError(ConnectionInterface $conn, /Exception $e) {
echo "An error has occurred: {$e->getMessage()}/n";
$conn->close();
}
}
Por supuesto, para que sea realmente útil, es posible que también desee agregar una conexión de base de datos y almacenar / recuperar esos recursos.