需求描述

某直播平台,需要观察员去不定时的抽查直播平台的内容,对于直播网站不良的直播进行封禁和停播的处理。

参考文献

Tcp server 服务:https://wiki.swoole.com/#/start/start_tcp_server?id=程序代码

端口监听:https://wiki.swoole.com/#/server/port?id=多端口监听

面向对象代码实现:https://github.com/mailjobblog/dev_swoole/tree/master/210427_listen

代码示例

面向过程代码

实现计划

  • server

    • 建立一个 【TCP服务,端口为9501】
    • 再建立一个监听服务,端口为9505,去监听 9501的TCP服务;
  • client

    • 作为观察角色,通过连接 9505 监听服务,然后监听服务再断掉 9501的TCP服务。

server.php

<?php
//创建Server对象,监听 0.0.0.0:9501 端口
$server = new Swoole\Server('0.0.0.0', 9501);

//监听连接进入事件
$server->on('Connect', function ($server, $fd) {
    echo "Client: Connect.\n";
});

//监听数据接收事件
$server->on('Receive', function ($server, $fd, $reactor_id, $data) {
    $server->send($fd, "Server: {$data}");
});

//监听连接关闭事件
$server->on('Close', function ($server, $fd) {
    echo "Client: Close.\n";
});



//返回port对象
$port1 = $server->listen("127.0.0.1", 9505, SWOOLE_SOCK_TCP);
$port1->on('connect', function ($serv, $fd){
    echo " port1 Client:{$fd}Connect 已经连接到监听服务.\n";
});

$port1->on('receive', function ($serv, $fd, $from_id, $data )use ($server) {
    $server->shutdown(); // 关闭 server 服务
    $serv->send($fd, 'Swoole: '.$data);
    $serv->close($fd);
});
$port1->on('close', function ($serv, $fd) {
    echo "  port1Client:{$fd} Close 关闭监听服务的连接.\n";
});



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

client.php

<?php
$client = new Swoole\Client(SWOOLE_SOCK_TCP);
if (!$client->connect('127.0.0.1', 9505, -1)) {
    exit("connect failed. Error: {$client->errCode}\n");
}
$client->send("我是来关闭你的server的\n");
echo $client->recv();
$client->close();

测试截图

面向对象代码

代码下载

参照上文中的参考文献下载

逻辑描述

通过连接业务服务,然后发送 code=0 的标识。 业务服务将该请求进行判断,然后发送给监听服务。 监听服务根据需求,处理相关的业务(停止/详情)逻辑。

stopClient.php 测试截图

image-20210427192457010

infoClient.php 测试截图

image-20210427190951718