• 消息处理
    • 注解
      • WsController
      • MessageMapping
    • 说明
    • 示例
      • 定义ws模块
      • 消息控制器

    消息处理

    如果你定义的ws模块类没有添加 OnMessage 处理方法,框架将会自动托管这个阶段,解析消息并根据路由分发到不同的方法执行。

    注解

    WsController

    websocket 消息控制器注解tag @WsController

    • 注解类: Swoft\WebSocket\Server\Annotation\Mapping\WsController
    • 作用范围: CLASS
    • 拥有属性:
      • prefix string 消息路由前缀

    MessageMapping

    方法注解 @MessageMapping 标记具体的消息处理方法,类似于http控制器里的action。

    • 注解类: Swoft\WebSocket\Server\Annotation\Mapping\MessageMapping
    • 作用范围: METHOD
    • 拥有属性:
      • command string 消息命令名称

    说明

    完整的消息路由path是 上面的 preifxcommand 由点拼接而成 PREFIX.COMMAND

    示例

    定义ws模块

    注意 要绑定消息处理控制器,通常也需要绑定你的消息解析器,内置了几个简单的解析器。

    1. <?php declare(strict_types=1);
    2. namespace App\WebSocket;
    3. use App\WebSocket\Chat\HomeController;
    4. use Swoft\Http\Message\Request;
    5. use Swoft\WebSocket\Server\Annotation\Mapping\OnOpen;
    6. use Swoft\WebSocket\Server\Annotation\Mapping\WsModule;
    7. use Swoft\WebSocket\Server\MessageParser\TokenTextParser;
    8. use function server;
    9. /**
    10. * Class ChatModule
    11. *
    12. * @WsModule(
    13. * "/chat",
    14. * messageParser=TokenTextParser::class,
    15. * controllers={HomeController::class}
    16. * )
    17. */
    18. class ChatModule
    19. {
    20. /**
    21. * @OnOpen()
    22. * @param Request $request
    23. * @param int $fd
    24. */
    25. public function onOpen(Request $request, int $fd): void
    26. {
    27. server()->push($request->getFd(), "Opened, welcome!(FD: $fd)");
    28. }
    29. }

    消息控制器

    注意 必须使用注解 @WsController 以及 @MessageMapping

    1. <?php declare(strict_types=1);
    2. namespace App\WebSocket\Chat;
    3. use Swoft\Session\Session;
    4. use Swoft\WebSocket\Server\Annotation\Mapping\MessageMapping;
    5. use Swoft\WebSocket\Server\Annotation\Mapping\WsController;
    6. /**
    7. * Class HomeController
    8. *
    9. * @WsController()
    10. */
    11. class HomeController
    12. {
    13. /**
    14. * Message command is: 'home.index'
    15. *
    16. * @return void
    17. * @MessageMapping()
    18. */
    19. public function index(): void
    20. {
    21. Session::mustGet()->push('hi, this is home.index');
    22. }
    23. /**
    24. * Message command is: 'home.echo'
    25. *
    26. * @param $data
    27. * @MessageMapping()
    28. */
    29. public function echo($data): void
    30. {
    31. Session::mustGet()->push('(home.echo)Recv: ' . $data);
    32. }
    33. /**
    34. * Message command is: 'home.ar'
    35. *
    36. * @param $data
    37. * @MessageMapping("ar")
    38. *
    39. * @return string
    40. */
    41. public function autoReply($data): string
    42. {
    43. return '(home.ar)Recv: ' . $data;
    44. }
    45. }