3.创建server和client

一.创建服务端

//默认tcp协议,在我们的硬件通信中使用较多
$server = new Swoole\Server("0.0.0.0",9800);

//设置进程数,必须为正正数,会产生2+worker_num个数个进程
$server->set(['worker_num'=>2]);


//事件监听
//1。监听连接
//$server是Swoole\Server对象
//$fd是连接的文件描述符,发送数据/关闭连接时需要此参数
//$reactorId来自哪个Reactor线程,第三个参数
$server->on('connect',function($server, $fd){
    echo "已连接到服务器:{$fd}".PHP_EOL;
});


//2。接收到客户端消息
//$server,Server对象
//$fd,TCP客户端连接的唯一标识符
//$reactor_id,TCP连接所在的Reactor线程ID
//$data,收到的数据内容,可能是文本或者二进制内容
//参数$fd是唯一标识,用于区分不同的客户端,同时该参数是1-1600万之间可以复用的整数。简单解释下复用:假设现在客户端1、2、3处于连接中,客户端4要连接的话$fd就是4,但是不巧的是客户端3连接不稳定,断掉了,客户端4连接到server的话,$fd就是3,这样看的话1600W个连接够用吗?单机业务百万连接,已经是很厉害了,不用担心
$server->on('receive',function($server, int $fd, int $reactor_id, string $data){
    echo "接收到客户端消息:{$fd}".PHP_EOL;
    $server->send($fd, "Server: ".$data);
});

//3。连接关闭
$server->on('close',function(){
    echo "已关闭连接".PHP_EOL;
});

//开启服务
$server->start();

二.创建同步客户端

同步client是同步阻塞的。一整套connect->send()->rev()->close()是同步进行的。如果需要大量的数据处理,后台不能在规定的时间内返回数据会导致接收超时,并且因为是同步执行所以需要等待后台数据的返回。

$client = new swoole_client(SWOOLE_SOCK_TCP,SWOOLE_SOCK_SYNC);

$client->connect('127.0.0.1',9800);

//发送数据,需要做粘包处理
$client->send('我是客户端');

//接收数据
var_dump($client->recv());

//关闭,关闭不能这么草率,需要做应答
$client->close();

三.创建异步客户端

当设定swoole_client为异步模式后,swoole_client就不能使用recv方法了,而需要通过on方法提供指定的回调函数,然后在回调函数当中处理,也就是小明等待奶茶(在4中解释)做好了异步通知,消息发送跟接收并不是同步运行的。

$client = new Swoole\Client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);

//必须注册事件。注册所有事件
$client->on("connect", function(swoole_client $cli) {
    $cli->send("GET / HTTP/1.1\r\n\r\n");
});

//异步客户端发送消息后不能立即收到回复,但是会首先注册好监听事件,收到消息后再处理
$client->on("receive", function(swoole_client $cli, $data){
    echo "Receive: $data";
    //$cli->send(str_repeat('A', 100)."\n");
    //sleep(1);
});

$client->on("error", function(swoole_client $cli){
    echo "error\n";
});
$client->on("close", function(swoole_client $cli){
    echo "Connection close\n";
});
$client->connect('127.0.0.1', 9800);

echo '写日志';
echo '调用api'; 

你可能感兴趣的:(3.创建server和client)