Gateway默认不支持http的问题。

banice

手册上写Gateway是不支持http协议的。可不可自己在gateway的portocols下建一个类继承自Worker去实现http协议,最后注册到register的worker上?
或者还有别的什么解决方法?

我自己试了在创建一个基于http协议的gateway不同的端口,然后按端口处理业务,但是我收不到http请求的数据,可以发送数据,但是get和post的数据都收不到。

手册上是用gateway client去访问gateway的端口。上面的方法可不可行?

阅读 2726
1个回答

walkor

Gateway本身是支持http协议的,只是不建议使用。初始化Gateway 的时候指定http协议即可。
类似new Gateway('http://0.0.0.0:8080')

为什么不建议Gateway里使用http协议?
http 是请求响应式的,只有客户端发送了请求,服务端才能响应。
所以当一个http链接没有发来请求前,服务端直接向这个链接发送数据是无效的。
如果客户端发来请求,服务端进行了回应,在这个客户端没有再次发送请求前,服务端向其发送的数据都是无效的。
也就如果用http协议,服务端很难做到随时向客户端推送数据,除非是长轮询。

Gateway更适合实时双向通讯的,Gateway可以任意时刻向客户端推送数据,http协议放到Gateway上用并不合适。

即时使用http协议,Gateway里面也不是用$_POST $_GET来获取数据,Gateway数据都是统一通过onMessage的参数传递进去的,http协议也是一样。

public static function onMessage($client_id, $data) {
    // 这里是客户端发来的数据,包括get post server cookie 等数据
    var_dump($data);
}

最后不建议在Gateway里使用http协议,除非你对http机制很熟悉。

  • banice 2017-04-15

    嗯,我用文档里的GatewayClient实现了对下位机的控制,但是Client只是共享了Gateway的数据。我能在Client里单独设置心跳之类的吗?我通过Client发送命令给下位机,但是如果下位机并未收到命令,也就是不会做任何的响应,这时候client要怎么判断自己到底有没有发送成功?

    我现在的想法是为每个下位机的session里通过各种下位机的状态和命令状态来做判断。还是在Client里做定时器?但是文档里Client好像是只能调用Gateway的函数。

  • walkor 2017-04-17

    发送前可以通过onLine接口判断客户端是否在线。在线的可以基本认为数据可以发送成功。
    最保险的机制是每次发送数据写一条记录到数据库,有个字段标记消息未读。客户端收到消息后给服务端一个反馈,服务端收到反馈标记对应消息已读。