消息处理

如果你定义的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. }