SWOOLE之广播消息实现

背景:

使用swoole_server swoole_table实现

//创建swoole_table
$table = new swoole_table(1024);
$table->column(‘fd‘, swoole_table::TYPE_INT);
$table->column(‘from_id‘, swoole_table::TYPE_INT);
$table->column(‘data‘, swoole_table::TYPE_STRING, 64);
$table->create();

//创建$sev对象,监听9501端口
$serv = new swoole_server(‘0.0.0.0‘, 9501, SWOOLE_PROCESS, SWOOLE_SOCK_TCP);

//设置相关属性
$serv->set(array(
    ‘ractor_num‘    =>    1,    //主进程中线程数量
    ‘worker_num‘    =>    2,    //工作进程数量
    ‘daemonize‘        =>    0,  //是否守护进程
    ‘log_file‘        =>    ‘/data/wwwroot/swoole.log‘,    //日志存储路径
    ‘dispatch_mode‘ =>     2,     //1平均分配,2按FD取摸固定分配,3抢占式分配,默认为取模(dispatch=2)‘
    ‘task_worker_num‘=> 2,
));

//连接
$serv->on(‘connect‘, function($serv, $fd){
    global $table;
    $fdinfo = $serv->connection_info($fd);
    if (!$table->exist($fd)) {
        $table->set($fd,array(‘fd‘=>$fd,‘from_id‘=>$fdinfo[‘from_id‘],‘data‘=>$fdinfo[‘socket_type‘]));
    }
});

//接收数据
$serv->on(‘receive‘, function($serv, $fd, $from_id, $data){
    if (trim($data)=="sendBroadcast") {
        $task_id = $serv->task(‘broadcast‘);
    } else {
        $serv->send($fd, "hello " . $fd . "i am main process " . $serv->master_pid . " and manger id " . $serv->manager_pid);
    }
});

//关闭
$serv->on(‘close‘, function($serv, $fd){
    echo $fd . " bye bye!!!";
});

//workstart事件
$serv->on(‘workerstart‘, function($serv, $work_id){
    global $argv;
    if($work_id  >= $serv->setting[‘worker_num‘]){
        swoole_set_process_name("php {$argv[0]} task worker");
    }else{
        swoole_set_process_name("php {$argv[0]} work worker");
    }
});

//server task
$serv->on(‘task‘,function($serv, $taskid, $from_id, $data){
    global $table;
    foreach($table as $row){
        $serv->send($row[‘fd‘],"{$row[‘fd‘]} i am broadcast");
    }
    
    $serv->finish("$data -> OK");
});

//处理异步任务的结果
$serv->on(‘finish‘, function ($serv, $task_id, $data) {
    echo "AsyncTask[$task_id] Finish: $data".PHP_EOL;
});
//启动
$serv->start();

时间: 2024-11-07 18:04:45

SWOOLE之广播消息实现的相关文章

Netty利用ChannelGroup广播消息

在Netty中提供了ChannelGroup接口,该接口继承Set接口,因此可以通过ChannelGroup可管理服务器端所有的连接的Channel,然后对所有的连接Channel广播消息. Server端: public class BroadCastServer { public static void run(int port) { EventLoopGroup boss = new NioEventLoopGroup(); EventLoopGroup worker = new NioE

Remoting异步回调,向在线用户广播消息

本文目的:向Remoting在线客户端广播消息. 使用的主要技术:异步,回调,广播. 实现过程: 定义远程实例 using System; using System.Collections.Generic; using System.Text; using System.Runtime.Remoting.Messaging; namespace RemoteObject { //定义委托,显示回调消息 public delegate void ShowCallBackMsg(string str

netty解决channel管理,可广播消息

在Netty中提供了ChannelGroup接口,该接口继承Set接口,因此可以通过ChannelGroup可管理服务器端所有的连接的Channel,然后对所有的连接Channel广播消息. Server端: public class BroadCastServer { public static void run(int port) { EventLoopGroup boss = new NioEventLoopGroup(); EventLoopGroup worker = new NioE

android菜鸟学习笔记26----Android广播消息及BroadcastReceiver

1.广播类型: Android中的广播有两种类型:标准广播和有序广播.其中,标准广播是完全异步发送的广播,发出之后,几乎所有的广播接收者都会在同一时刻收到这条广播消息,因而,这种类型的广播消息是不可拦截,不可修改的:而有序广播是一种同步发送的广播,广播发出后,只有优先级最高的广播接收者能够收到这条广播消息,它处理完自己的逻辑之后,广播才会向后继续传递给低优先级的广播接收者,因此,高优先级的广播接收者可以对广播消息进行拦截,修改操作. 2.接收系统广播: 要接收系统广播,就要有自己的广播接收者.定

node的socket.io的广播消息

在多个客户端与服务器端建立连接后,socket.io()服务器具有一个sockets属性,属性值为所有与客户端建立连接的socket对象.可以利用该对象的send方法或emit方法向所有客户端广播消息. io.sockets.send("user commected); io.socket.emit("login",names); 案例 server.js代码: 1 var express=require("express"); 2 var http=re

android 如何屏蔽接收来自某些信道的小区广播消息

客户发现4370~4382的小区广播信道被打开了,想屏蔽这些信道的小区广播消息,可以参考如下设置: 1. 在SmsCbConstants.java(alps/frameworks/opt/telephony/src/java/com/android/internal/telephony/gsm) 中添加宏: public static final int MESSAGE_ID_CBDD_IDENTIFIER_MIN = 0x1112; // add by mtk for 4370 public

android 监听 USB 拔插广播消息

Java: 1 package com.example.communication; 2 3 import android.content.BroadcastReceiver; 4 import android.content.Context; 5 import android.content.Intent; 6 import android.widget.Toast; 7 8 public class USBBroadcastReceiver extends BroadcastReceiver

Linux系统下UDP发送和接收广播消息小例子

[cpp] view plaincopy // 发送端 #include <iostream> #include <stdio.h> #include <sys/socket.h> #include <unistd.h> #include <sys/types.h> #include <netdb.h> #include <netinet/in.h> #include <arpa/inet.h> #includ

rabbitMQ应用,laravel生产广播消息,springboot消费消息

最近做一个新需求,用户发布了动态,前台需要查询,为了用户读取信息响应速度更快(MySQL很难实现或者说实现起来很慢),所以在用户动态发布成功后,利用消息机制异步构建 redis缓存 和 elasticsearch索引 . 开发环境 rabbitMQ服务端,docker安装 拉取rabbit-mq镜像 docker pull hub.c.163.com/library/rabbitmq:3.6.10-management 运行镜像 docker run -d --name rabbitmq --p