UDP 控制器

定义

  1. <?php
  2. namespace ImiDemo\UdpDemo\MainServer\Controller;
  3. use Imi\ConnectContext;
  4. use Imi\Server\Route\Annotation\Udp\UdpRoute;
  5. use Imi\Server\Route\Annotation\Udp\UdpAction;
  6. use Imi\Server\Route\Annotation\Udp\UdpController;
  7. /**
  8. * 数据收发测试
  9. * @UdpController
  10. */
  11. class Test extends \Imi\Controller\UdpController
  12. {
  13. /**
  14. * 登录
  15. *
  16. * @UdpAction
  17. * @UdpRoute({"action"="hello"})
  18. * @return void
  19. */
  20. public function hello()
  21. {
  22. return [
  23. 'time' => date($this->data->getFormatData()->format),
  24. ];
  25. }
  26. }

首先控制器类必须有@UdpController注解,对应动作必须有@UdpAction@UdpRoute注解。

注解

@UdpRoute

指定 Udp 路由解析规则。

  1. // 解析 $data['action'] === 'login'
  2. @WSRoute({"action"="login"})
  3. // 解析 $data['a']['b']['c'] === 'login'
  4. @WSRoute({"a.b.c"="login"})
  5. // 解析 $data['a'] == '1' && $data['b'] == '2'
  6. @WSRoute({"a"="1", "b"="2"})

当然对象也是支持的:

  1. // 解析 $data->a->b->c === 'login'
  2. @WSRoute({"a.b.c"="login"})

路由匹配成功,就会执行这个动作。

动作响应数据

响应当前这个请求

直接在方法中返回一个数组或对象,在服务器配置设定的处理器,就会把这个转为对应数据响应给客户端。

配置文件

  1. return [
  2. // 项目根命名空间
  3. 'namespace' => 'ImiDemo\UdpDemo',
  4. // 扫描目录
  5. 'beanScan' => [
  6. ],
  7. // 主服务器配置,提供websocket服务
  8. 'mainServer' => [
  9. 'namespace' => 'ImiDemo\UdpDemo\MainServer',
  10. 'type' => Type::UDP_SERVER,
  11. 'host' => '0.0.0.0',
  12. 'port' => 8087,
  13. 'configs' => [
  14. 'reactor_num' => 2,
  15. 'worker_num' => 2,
  16. 'task_worker_num' => 8,
  17. ],
  18. // 数据处理器
  19. 'dataParser' => Imi\Server\DataParser\JsonObjectParser::class,
  20. ],
  21. }

响应数据

  1. return ['success'=>true];

分组发送

由于UDP的特性,所以不支持分组发送。如有需要,可根据实际场景自行实现分组。

$data

方法

  1. /**
  2. * 获取客户端的socket id
  3. * @return int
  4. */
  5. public function getFd(): int;
  1. /**
  2. * 数据内容,可以是文本内容也可以是二进制数据,可以通过opcode的值来判断
  3. * @return string
  4. */
  5. public function getData();
  1. /**
  2. * 获取客户端信息
  3. * @return array
  4. */
  5. public function getClientInfo();
  6. // 格式同:https://wiki.swoole.com/wiki/page/477.html