关于“如何在php后端及时推送消息给客户端”文章的疑问

蜗牛

在这篇http://wenda.workerman.net/?/question/508文章中,我按照 walkor 上面的给的案例与步骤来做,最后用把
// 建立socket连接到内部推送端口
$client = stream_socket_client('tcp://127.0.0.1:5678', $errno, $errmsg, 1);
// 推送的数据,包含uid字段,表示是给这个uid推送
$data = array('uid'=>'uid1', 'percent'=>'88%');
// 发送数据,注意5678端口是Text协议的端口,Text协议需要在数据末尾加上换行符
fwrite($client, json_encode($data)."\n");
// 读取推送结果
echo fread($client, 8192);
这段代码放到test1.php文件,使用php test1.php start,发现输出是fail,后来我跟踪,
发现在google浏览器按f12后,输入如下代码:

var ws = new WebSocket('ws://127.0.0.1:1234');
 ws.onopen = function(){
     var uid = 'uid1';
     ws.send(uid);
 };
 ws.onmessage = function(e){
     alert(e.data);
 };

连接的时候并未进入以下这段代码:

$worker->onMessage = function($connection, $data)use($worker)
 {
     // 判断当前客户端是否已经验证,既是否设置了uid
     if(!isset($connection->uid))
     {
        // 没验证的话把第一个包当做uid(这里为了方便演示,没做真正的验证)
       $connection->uid = $data;
        /* 保存uid到connection的映射,这样可以方便的通过uid查找connection,
        * 实现针对特定uid推送数据
        */
        $worker->uidConnections = $connection;
        return;
     }
 };

那么请问,这个如何uid是如何得到的?谢谢!

3546 4 0
4个回答

蜗牛

我发送不知道为什么,我使用google浏览器的f12调试,直接在命令行输入ws.send('uid');服务可以接收数据,但执行ws.onopen = function(){ var uid = 'uid1'; ws.send(uid); };这条语句中send没有发送数据给服务器,所以造成php后台在执行以下语句后
// 建立socket连接到内部推送端口
$client = stream_socket_client('tcp://127.0.0.1:5678', $errno, $errmsg, 1);
// 推送的数据,包含uid字段,表示是给这个uid推送
$data = array('uid'=>'uid1', 'percent'=>'88%');
// 发送数据,注意5678端口是Text协议的端口,Text协议需要在数据末尾加上换行符
fwrite($client, json_encode($data)."\n");
// 读取推送结果
echo fread($client, 8192);
返回的都是fail语句。

  • 暂无评论
walkor

http://wenda.workerman.net/?/question/508

里面的代码很多人在用了,没问题的,估计你哪里没理解对或者搞乌龙了

  • 暂无评论
six

信老大,得永生

  • 暂无评论
蜗牛

这个是我测试得出来的结果,因为我直接和硬件交互的时候,发现push.php文件是可以收到数据的,但用google来测试,发送“ws.onopen = function(){ var uid = 'uid1'; ws.send(uid); };”这个指令的时候,push.php文件竟然没有把uid输出来。

  • 暂无评论
年代过于久远,无法发表回答
🔝