swoole中的websocket的如果发给指定人消息

swoole版本:1.9.2 需求:
类似直播的评论功能, 比如A房间下面显示A房间的评论 B房间下面显示B房间的评论.... 这个应该是个正常的需求吧.. 但是我现在发现一个问题, 就是 消息是发给所有在线链接者.. 就是相当于A下面的评论在 BCDEF 都能看到.. 这就很蛋疼了... 不知道啥问题.. 求各位大哥大姐帮帮忙看看. 公司很急呀

代码如下:

<?php
$ws = new Swoole\Websocket\Server("0.0.0.0", 9508);
//监听WebSocket连接打开事件
$ws->on('open', function ($ws, $request) {

    $fd = $request->fd;
    echo "client-{$fd} is connect\n";
    //$ws->push($request->fd, "hello, welcome\n");
});

//监听WebSocket消息事件
$ws->on('message', function ($ws, $frame) {

    // $msg =  'from'.$frame->fd.":{$frame->data}\n";
    // $data   = htmlentities(htmlspecialchars($frame->data));
    // if(mb_strlen($data,'utf8')>30){
    //     $data = mb_substr($data, 0,30,'utf-8').'...';
    // }
    $data = json_decode($frame->data,true);
     //判断是否有礼物
    if($data['gift']){
        $gift = json_decode($data['gift'],true);
        $arr = array(
        'info'   => $data['info'],
        'uid'    => $data['uid'],
        'username' =>$data['username'],
        'imageSrc' =>$gift['img'],
        'number' =>$gift['number'],
    );

    }else{

    // 正常发送
    $arr = array(
        'info'   => $data['info'],
        'uid'    => $data['uid'],
        'username' =>$data['username'],
        'href'   => 'javascript:void(0);',
        'status' => 1
    );
    }

    $msg = json_encode($arr);

    foreach($ws->connections as $fd) {
        //发送信息
        $ws->push($fd, $msg);
    }


});

//监听WebSocket连接关闭事件
$ws->on('close', function ($ws, $fd) {
    echo "client-{$fd} is closed\n";
});

$ws->start();
2017-02-03 16:28
0
0

zts1982

赞同来自:

房间的概念应该是要你自己业务层去实现 比如用自己定义的数组来保存房间和房间内的用户 然后再去遍历对应的数组

2017-02-04 17:30
0

zts1982

赞同来自:

<?php $ws = new Swoole\Websocket\Server("0.0.0.0", 9508);

$ws->on('open', function ($ws, $request) { parse_str($request->server['query_string'],$get); $fd = $request->fd; $GLOBALS['room_users'][$get['roomId']][] = $fd; $GLOBALS['user_room'][$fd] = $get['roomId']; echo "client-{$fd} is connect\n"; });

$ws->on('message', function ($ws, $frame) {

$data = json_decode($frame-&gt;data,true);
//判断是否有礼物
if($data['gift']){
    $gift = json_decode($data['gift'],true);
    $arr = array(
        'info'   =&gt; $data['info'],
        'uid'    =&gt; $data['uid'],
        'username' =&gt;$data['username'],
        'imageSrc' =&gt;$gift['img'],
        'number' =&gt;$gift['number'],
    );

}else{

    $arr = array(
        'info'   =&gt; $data['info'],
        'uid'    =&gt; $data['uid'],
        'username' =&gt;$data['username'],
        'href'   =&gt; 'javascript:void(0);',
        'status' =&gt; 1
    );
}

$msg = json_encode($arr);
$roomId = $GLOBALS['user_room'][$frame-&gt;fd];
foreach($GLOBALS['room_users'][$roomId] as  $user){
    $ws-&gt;push($user,$msg);
}

});

$ws->on('close', function ($ws, $fd) { echo "client-{$fd} is closed\n"; });

$ws->start(); ?>

客户端发送时设置不同get参数进入不同的房间 比如: ws://192.168.1.108:9508?roomId=a

2017-02-04 19:15
0

天天天蓝

赞同来自:

这个东西 像二楼说的一样,如果是一对聊天,需要前段用cookie或者session来确定为指定的某个人,当人发送时全部发送到服务端,客户端接收只是根据你的判断前后端都需要判断比如后端再监听消息方法中判断这条消息是不是发给我的 这个我就用session,cookie来待定,可以用post隐藏传递过后台,100条信息里 其中有我的一条信息就把这条信息取出来,前段也是一样判断, 聊天室的话就可以分类是一个道理的 聊天室id放在缓存机制中就可以,这是最基本的判定

2018-12-15 16:30

要回复问题请先登录注册