Saltar al contenido

Cómo enviar mensajes a usuarios particulares Ratchet PHP Websocket

Posteriormente a indagar en varios repositorios y páginas webs de internet al final nos encontramos con la respuesta que te mostramos a continuación.

Solución:

Básicamente, desea una sintaxis para enviar datos al WebSocket, recomiendo usar un objeto JSON para hacer esto. En su clase WebSocket necesita una variable local llamada subscriptions y una variable local llamada users al igual que.

clients = new SplObjectStorage;
        $this->subscriptions = [];
        $this->users = [];
    

    public function onOpen(ConnectionInterface $conn)
    
        $this->clients->attach($conn);
        $this->users[$conn->resourceId] = $conn;
    

    public function onMessage(ConnectionInterface $conn, $msg)
    
        $data = json_decode($msg);
        switch ($data->command) 
            case "subscribe":
                $this->subscriptions[$conn->resourceId] = $data->channel;
                break;
            case "message":
                if (isset($this->subscriptions[$conn->resourceId])) 
                    $target = $this->subscriptions[$conn->resourceId];
                    foreach ($this->subscriptions as $id=>$channel) 
                        if ($channel == $target && $id != $conn->resourceId) 
                            $this->users[$id]->send($data->message);
                        
                    
                
        
    

    public function onClose(ConnectionInterface $conn)
    
        $this->clients->detach($conn);
        unset($this->users[$conn->resourceId]);
        unset($this->subscriptions[$conn->resourceId]);
    

    public function onError(ConnectionInterface $conn, Exception $e)
    
        echo "An error has occurred: $e->getMessage()n";
        $conn->close();
    

?>

El javascript para ir con eso se parece un poco a esto


Nota: este código no está probado. Lo escribí sobre la marcha a partir de mi experiencia con Ratchet. Buena suerte 🙂

ok, ahora comparto mi experiencia. Puede enviar token e insertar este token en onOpen (server.php) en la base de datos. Puede insertar el token de chat cuando el usuario inicie sesión. Cada vez que se genera y actualiza un nuevo token de inicio de sesión de usuario. Ahora use este token para averiguar la identificación del usuario en la conexión onOpen.

var conn = new WebSocket('ws://172.16.23.26:8080?token=');    
    conn.onopen = function(e) 
        console.log("Connection established!");
    ;

Ahora Servidor.php

  public function onOpen(ConnectionInterface $conn) 
    $this->clients->attach($conn);      
    $querystring = $conn->httpRequest->getUri()->getQuery();
    parse_str($querystring,$queryarray);
   //Get UserID By Chat Token
    $objUser = new users;
    $objUser->setLoginToken($queryarray['token']);
    $GetUserInfo = $objUser->getUserByToken();
    echo "New connection! ($conn->resourceId)n";
    //save Chat Connection
   // Insert the new connection with the user ID to Match to later if user ID in Table Then Update IT with a new connection 

 

Ahora su conexión está establecida, luego envíe un mensaje a usuarios particulares

El lado del cliente envía ID de usuario con ID y mensaje recibidos

$("#conversation").on('click', '#ButtionID', function () 
         var userId      = $("#userId").val();
         var msg         = $("#msg").val();         
         var receiverId  = $("#receiverId").val();
      if ( userId  != null &&  msg  != null )
        var data = 
            userId: userId,
            msg: msg,
            receiverId: receiverId
        ;
        conn.send(JSON.stringify(data));
        $("#msg").val("");  
                       
    );

Lado del servidor

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');
      $data = json_decode($msg, true);
      echo $data['userId'];
      echo $data['msg'];
      echo $data['receiverId'];
     // Save User ID receiver Id message in table 
     //Now Get Chat Connection by user id By Table Which is saved onOpen function    
        $UptGetChatConnection   = $objChatroom->getChatConnectionUserID($data['receiverId']);
    $ReciId = $UptGetChatConnection[0]['ConnectionID'];
    foreach ($this->clients as $client) 
        if ($from == $client) 
           $data['from']  = "Me";
           $data['fromname'] = 5;
         else 
           $data['from']  = $user['name'];
           $data['fromname'] = 6;
        
        echo $client->resourceId;
        echo $ReciId."n";
        if($client->resourceId == $ReciId 
 

ahora el mensaje se ha enviado por ID de conexión, no se transmite solo se envía a usuarios particulares

Comentarios y valoraciones

¡Haz clic para puntuar esta entrada!
(Votos: 2 Promedio: 4)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *