TCP 控制器
定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <?php namespace ImiDemo\TcpDemo\MainServer\Controller; use Imi\ConnectionContext; use Imi\Server\TcpServer\Route\Annotation\TcpRoute; use Imi\Server\TcpServer\Route\Annotation\TcpAction; use Imi\Server\TcpServer\Route\Annotation\TcpController; /** * 数据收发测试 * @TcpController */ class Test extends \Imi\Controller\TcpController { /** * 登录 * * @TcpAction * @TcpRoute({"action"="login"}) * @return void */ public function login( $data ) { ConnectionContext::set( 'username' , $data ->username); $this ->server->joinGroup( 'g1' , $this ->data->getClientId()); return [ 'action' => 'login' , 'success' =>true]; } } |
首先控制器类必须有@TcpController
注解,对应动作必须有@TcpAction
和@TcpRoute
注解。
注解
@TcpController
注释目标:类
表明一个类是控制器类
属性名称 | 说明 |
---|---|
server | 指定当前控制器允许哪些服务器使用。支持字符串或数组,默认为 null 则不限制 |
@TcpRoute
指定 Tcp 路由解析规则。
1 2 3 4 5 6 | // 解析 $data['action'] === 'login' @TcpRoute({ "action" = "login" }) // 解析 $data['a']['b']['c'] === 'login' @TcpRoute({ "a.b.c" = "login" }) // 解析 $data['a'] == '1' && $data['b'] == '2' @TcpRoute({ "a" = "1" , "b" = "2" }) |
当然对象也是支持的:
1 2 | // 解析 $data->a->b->c === 'login' @TcpRoute({ "a.b.c" = "login" }) |
路由匹配成功,就会执行这个动作。
动作响应数据
响应当前这个请求
直接在方法中返回一个数组或对象,在服务器配置设定的处理器,就会把这个转为对应数据响应给客户端。
响应数据:
1 | return [ 'success' =>true]; |
分组发送
1 | $this ->server->groupCall( '组名' , 'push' , [ 'success' =>true]); |
当然,并不是每个请求都需要有响应数据,什么都不return
或者return null
就是不响应数据。
类属性
$server
详见:链接
$data
当然,你还可以直接通过请求上下文代理类,在任意地方使用:
1 | \Imi\Server\TcpServer\Message\Proxy\ReceiveDataProxy::getFormatData(); |
方法
1 2 3 4 5 | /** * 获取客户端的socket id * @return int|string */ public function getClientId(); |
1 2 3 4 5 | /** * 数据内容,可以是文本内容也可以是二进制数据,可以通过opcode的值来判断 * @return string */ public function getData(); |
1 2 3 4 5 | /** * 获取格式化后的数据,一般是数组或对象 * @return mixed */ public function getFormatData(); |
1 2 3 4 | /** * 获取客户端地址 */ public function getClientAddress(): \Imi\Util\Socket\IPEndPoint; |
控制器类方法
encodeMessage
1 2 3 4 5 6 7 | /** * 编码消息,把数据编码为发送给客户端的格式 * * @param mixed $data * @return mixed */ protected function encodeMessage( $data ) |