× 警告!旧版文档已经暂停维护,请查看新版文档。点击前往新版文档

多端口监听的使用

Swoole提供了多端口监听的机制,这样可以同时监听UDP和TCP,同时监听内网地址和外网地址。内网地址和端口用于管理,外网地址用于对外服务。

$serv = new swoole_server("0.0.0.0", 9501);
//这里监听了一个UDP端口用来做内网管理
$serv->addlistener('127.0.0.1', 9502, SWOOLE_SOCK_UDP);
$serv->on('connect', function ($serv, $fd) {
    echo "Client:Connect.\n";
});
$serv->on('receive', function ($serv, $fd, $from_id, $data) {
    $info = $serv->connection_info($fd, $from_id);
    //来自9502的内网管理端口
    if($info['server_port'] == 9502) {
        $serv->send($fd, "welcome admin\n");
    }
    //来自外网
    else {
        $serv->send($fd, 'Swoole: '.$data);
    }
});
$serv->on('close', function ($serv, $fd) {
    echo "Client: Close.\n";
});
$serv->start();

Web层只需向此UDP端口发送管理的指令即可

$client = new swoole_client(SWOOLE_SOCK_UDP, SWOOLE_SOCK_SYNC);
$client->connect('127.0.0.1', 9502);
$client->send("admin");
echo $client->recv();

  • zhou

    监听一个地址的多个端口怎样操作

  • 奇Yu

    if($info['from_port'] == 9502) 这句好像错了 if($info['server_port'] == 9502)

  • SvenLiu

    测试的确是server_port

  • 晕头转向

    $info['from_port'] == 9502这写错了吧,应该改为$info['server_port'] == 9502

  • 奇葩火星人

    @晕头转向 已测试确实是 $info['server_port'] == 9502 ,感谢

  • seraph

    那个啥 创建了2个udp的listener并set了两个不同的onpacket方法 使用sento返回数据的时候发现,udp源端口错了 send($fd)则不会有此问题

  • seraph

    send($fd)无问题的方法不够严谨,因为我只监听了一个tcp端口。虽然根据tcp的发送逻辑来看出问题的可能性不大-0 -!