作为socket长连接服务器,Swoole如果要做到主动对已经连接过来的,用户uid=123的那个用户,推送一条消息应该怎么写?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了作为socket长连接服务器,Swoole如果要做到主动对已经连接过来的,用户uid=123的那个用户,推送一条消息应该怎么写?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2540字,纯文字阅读大概需要4分钟。
内容图文
![作为socket长连接服务器,Swoole如果要做到主动对已经连接过来的,用户uid=123的那个用户,推送一条消息应该怎么写?](/upload/InfoBanner/zyjiaocheng/155/c37429282dd34c1aaf6c4a0e6e749aba.jpg)
回复内容:
额,这应该是菜鸟级别的问题,但是看了文档我还是无从下手。
php的socket是资源类型:
resource(4) of type (Socket),也就是每个socket句柄都一个样子。。
而Linux C socket fd是个int整数,每个都是不同数字。
原生php做不到“主动对已经连接过来的,用户uid=123的那个用户,推送一条消息”,
但借助Swoole利用linux C实现的socket,我们可以实现“主动对已经连接过来的,用户uid=123的那个用户,推送一条消息”。
这里我们可以用System V最简单的share memory来进程间共享数据IPC,维护一个用户id与其socket连接的映射表。
代码如下:
set(array(
'worker_num' => 8, //工作进程数量
'daemonize' => false, //是否作为守护进程
));
$shmid = shm_attach(getmypid(), 1024*66); # allocate 66kB for shared memory
define("SHARED_UID_CONNECTION_MAP", 12);
shm_put_var($shmid,SHARED_UID_CONNECTION_MAP, []);
$serv->on('connect', function ($serv, $fd) use($shmid) {
echo "Client:Connect.\n";
});
$serv->on('receive', function ($serv, $fd, $from_id, $data) use($shmid) {
$serv->send($fd, 'Swoole: '.$data);
// $serv->close($fd);
$trimdata = trim($data);
if ($trimdata == 'i am lucky man') {
$map = shm_get_var($shmid,SHARED_UID_CONNECTION_MAP);
$map[] = $fd; #$map[$uidFromData] = $fd;
shm_put_var($shmid,SHARED_UID_CONNECTION_MAP, $map);
}
if ($trimdata == 'broadcast to lucky man') {
$map = shm_get_var($shmid,SHARED_UID_CONNECTION_MAP);
// var_dump($map); $ $map is array whose valuse is int $fd
foreach($map as $fd) {
$serv->send($fd, "some body broadcast to you luck man");
}
}
# broadcast to all users
// $start_fd = 0;
// while(true)
// {
// $conn_list = $serv->connection_list($start_fd, 10);
// if($conn_list===false or count($conn_list) === 0)
// {
// echo "finish\n";
// break;
// }
// $start_fd = end($conn_list);
// var_dump($conn_list);
// foreach($conn_list as $fd)
// {
// $serv->send($fd, "broadcast");
// }
// }
// var_dump($serv->connections);
// foreach ($serv->connections as $k => $v) {
// $lk = [$k,$v];
// var_dump($lk);
// }
});
$serv->on('close', function ($serv, $fd) {
echo "Client: Close.\n";
});
$serv->start();
然后就可以开n个客户端,来测试下代码,比如我开3个telnet 127.0.0.1 1024,最后一个发消息给服务器"i am lucky man",第一个再对服务器发"broadcast to lucky man",那么第三个就会收到""some body broadcast to you luck man",实现对特定用户发送消息。
就是这么简单,
Swoole大法好,异步io+多进程 也是最成熟的结局方案(致敬Nginx)
哈哈哈
uid只是你识别的uid而已,socket链接到服务,都有一个唯一的id,你要对客户端发送消息只能通过这个唯一的id,你可以在这两者之间做个映射,那就可以了。
内容总结
以上是互联网集市为您收集整理的作为socket长连接服务器,Swoole如果要做到主动对已经连接过来的,用户uid=123的那个用户,推送一条消息应该怎么写?全部内容,希望文章能够帮你解决作为socket长连接服务器,Swoole如果要做到主动对已经连接过来的,用户uid=123的那个用户,推送一条消息应该怎么写?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。