workerman 从服务器端向用户端推送消息代码

àì夳堔傛蜴生んèń 2022-04-22 13:34 481阅读 0赞

数据推送

  1. <?php
  2. $client = stream_socket_client('tcp://127.0.0.1:5678', $errno, $errmsg, 1);
  3. // 推送的数据,包含用户,表示是给这个用户推送
  4. $data = array('uid'=>'','group'=>'admin', 'message'=>'发送成功啦');
  5. // 发送数据,注意5678端口是Text协议的端口,Text协议需要在数据末尾加上换行符
  6. fwrite($client, json_encode($data)."\n");
  7. // 读取推送结果
  8. echo fread($client, 8192);

接收服务器端推送的数据并将数据发送到客户端

  1. <?php
  2. use Workerman\Worker;
  3. require_once 'Workerman\Autoloader.php';
  4. require_once 'Workerman\Lib\Timer.php';
  5. $worker = new Worker('websocket://127.0.0.1:1234');
  6. $worker->count = 1;
  7. // worker进程启动后建立一个内部通讯端口
  8. $worker->onWorkerStart = function($worker)
  9. {
  10. // 开启一个内部端口,方便内部系统推送数据,Text协议格式 文本+换行符
  11. $inner_text_worker = new Worker('Text://127.0.0.1:5678');
  12. $inner_text_worker->onMessage = function($connection, $buffer)
  13. {
  14. global $worker;
  15. // $data数组格式,里面有uid,表示向那个uid的页面推送数据
  16. $data = json_decode($buffer, true);
  17. $uid = $data['uid'];
  18. // 通过workerman,向uid的页面推送数据
  19. $ret = sendMessageByUid($uid, $buffer);
  20. // 返回推送结果
  21. $connection->send($ret ? 'ok' : 'fail');
  22. };
  23. $inner_text_worker->listen();
  24. };
  25. // 新增加一个属性,用来保存uid到connection的映射
  26. $worker->uidConnections = array();
  27. // 当有客户端发来消息时执行的回调函数
  28. $worker->onMessage = function($connection, $data)use($worker)
  29. {
  30. $connection->lastMessageTime = time();
  31. // 判断当前客户端是否已经验证,既是否设置了uid
  32. if(!isset($connection->uid))
  33. {
  34. // 没验证的话把第一个包当做uid(这里为了方便演示,没做真正的验证)
  35. $connection->uid = $data;
  36. /* 保存uid到connection的映射,这样可以方便的通过uid查找connection,
  37. * 实现针对特定uid推送数据
  38. */
  39. $worker->uidConnections[$connection->uid] = $connection;
  40. return;
  41. }
  42. };
  43. // 当有客户端连接断开时
  44. $worker->onClose = function($connection)use($worker)
  45. {
  46. global $worker;
  47. if(isset($connection->uid))
  48. {
  49. // 连接断开时删除映射
  50. unset($worker->uidConnections[$connection->uid]);
  51. }
  52. };
  53. // 向所有验证的用户推送数据
  54. function broadcast($message)
  55. {
  56. global $worker;
  57. foreach($worker->uidConnections as $connection)
  58. {
  59. $connection->send($message);
  60. }
  61. }
  62. // 针对用户推送数据
  63. function sendMessageByUid($uid, $message)
  64. {
  65. global $worker;
  66. var_dump($worker->uidConnections);
  67. if(isset($worker->uidConnections[$uid]))
  68. {
  69. $connection = $worker->uidConnections[$uid];
  70. $connection->send($message);
  71. return true;
  72. }
  73. return false;
  74. }
  75. // 运行所有的worker
  76. Worker::runAll();

客户端

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <script>
  9. var ws = new WebSocket('ws://127.0.0.1:1234');
  10. ws.onopen = function(){
  11. var uid = (new Date()).getTime();
  12. var data = {'group':'admin','uid':'uid2'};
  13. ws.send(JSON.stringify(data));
  14. };
  15. ws.onmessage = function(e){
  16. if (e.data!=''){
  17. alert(JSON.parse(e.data));
  18. }
  19. };
  20. </script>
  21. </body>
  22. </html>

发表评论

表情:
评论列表 (有 0 条评论,481人围观)

还没有评论,来说两句吧...

相关阅读