Chat Service - Send data to specific user

698 views
Skip to first unread message

youssef.e...@gmail.com

unread,
Jan 17, 2014, 10:26:57 AM1/17/14
to ratch...@googlegroups.com


im working on a PHP project based on Symfony 2.2.11 and I installed the socketo related to the following tutorial http://socketo.me/docs/install to make my chat script working.

ServerCommand.php // Code of the command line that starts the WebSocket server

$oLoop = Factory::create();

   
// Listen for the web server to make a ZeroMQ push after an ajax request
    $oContext
= new Context($oLoop);
    $oPull
= $oContext->getSocket(\ZMQ::SOCKET_PULL);
   
// LET IT 127.0.0.1
    $oPull
->bind('tcp://127.0.0.1:5555'); // Binding to 127.0.0.1 means the only client that can connect is itself
    $oPull
->on('message', array($oChat, 'onMessage'));

   
// Set up our WebSocket server for clients wanting real-time updates
    $oWebSock
= new Server($oLoop);
    $oWebSock
->listen(7979, '0.0.0.0'); // Binding to 0.0.0.0 means remotes can connect
    $webServer
= new IoServer(
       
new HttpServer(
           
new WsServer(
               
new WampServer(
                    $oChat
               
)
           
)
       
),
        $oWebSock
   
);

    $oLoop
->run();

After a message is being added to database : MessagesController.php

....
// This is our new stuff
        $oContext
= new \ZMQContext();
        $oSocket
= $oContext->getSocket(\ZMQ::SOCKET_PUSH, 'PushMe');
        $oSocket
->connect("tcp://mydomain:5555");

        $aData
= array(
           
'topic'         => 'message',
           
'sUsername'     => $oUserCurrent->getUsername(),
           
'sMessage'      => $sMessage
       
);

        $oSocket
->send(json_encode($aData));
.....

The chat service : Chat.php

/**
 * A lookup of all the topics clients have subscribed to
 */

public function onSubscribe(ConnectionInterface $conn, $topic)
{
   
// When a visitor subscribes to a topic link the Topic object in a  lookup array
    $subject
= $topic->getId();
    $ip
= $conn->remoteAddress;

   
if (!array_key_exists($subject, $this->subscribedTopics))
   
{
        $this
->subscribedTopics[$subject] = $topic;
   
}

    $this
->clients[] = $conn->resourceId;

    echo sprintf
("New Connection: %s" . PHP_EOL, $conn->remoteAddress);

}

/**
 * @param string JSON'ified string we'll receive from ZeroMQ
 */

public function onMessage($jData)
{
    $aData
= json_decode($jData, true);

    var_dump
($aData);

   
if (!array_key_exists($aData['topic'], $this->subscribedTopics)) {
       
return;
   
}

    $topic
= $this->subscribedTopics[$aData['topic']];

   
// This sends out everything to multiple users, not what I want!!

   
// re-send the data to all the clients subscribed to that category
    $topic
->broadcast($aData);
}

JS code that receives data : messages.html.twig :

var conn = new ab.Session(
                   
'ws://mydomain:7979' // The host (our Ratchet WebSocket server) to connect to
                 
, function() {            // Once the connection has been established
                        conn
.subscribe('message', function(topic, data)
                       
{
                            console
.log(topic);
                            console
.log(data);
                       
});
                   
}
                 
, function() {            // When the connection is closed
                        console
.warn('WebSocket connection closed');
                   
}
                 
, {                       // Additional parameters, we're ignoring the WAMP sub-protocol for older browsers
                       
'skipSubprotocolCheck': true
                   
}
               
);


So everytings working perfectly, when I send a new Message, it goes to DB then it lands on the page of the chat.

PROBLEM : The data lands wherever the JS script is, and the result is that all users can get the same recorded message

ASKING : How can I make data lands in a specific user by USERNAME or something else page ? So that not all users get the same message.

Thank you

cboden

unread,
Jan 23, 2014, 6:22:01 PM1/23/14
to ratch...@googlegroups.com, youssef.e...@gmail.com
In your example everyone subscripted to the topic called "message". Simply subscribe to a different topic name that is unique to as many people as you want to send the message to and publish to that topic. 
Reply all
Reply to author
Forward
0 new messages