关于onMessage回调方法每次的传输大小的问题

蜗牛

我想请问一下这个方法如果用来接收二进制流数据的,每次接收多少字节,还有我如何才知道这个二进制流数据是否已经传输完毕呢?谢谢。

2547 12 0
12个回答

walkor

workerman支持自定义通讯协议,每次接收多少字节是自己根据协议来确定的。
一般协议头里包含了这个包的大小。

通讯协议参考手册 http://doc.workerman.net/315123

  • 暂无评论
蜗牛

您是指使用frame协议吗?这个协议是如何使用的?有没例子说明使用方法呢

  • 暂无评论
蜗牛

我现在是这样使用的。

$tcp_worker = new Worker("tcp://0.0.0.0:8333");
$tcp_worker->onMessage = function($connection, $data)
{
//但这个$data是每次都只获取一点数据,而不是所有的数据,那我如何知道它这次有没传输出完成?
}

  • 暂无评论
walkor

可以参考frame协议的方式,将包长放到包的头部,也就是前4个字节是网络字节序的整数。
frame协议实现参考手册。http://doc.workerman.net/315308 ,其中打包解包都有。

workerman里协议设定很简单,类似这样

// tcp改成frame
$tcp_worker = new Worker("frame://0.0.0.0:8333");
$tcp_worker->onMessage = function($connection, $data)
{
    ///这里$data会是完整的数据
}

客户端frame实现根据客户端语言而定。我这里没有其它语言的例子。

一般长连接通讯中不能使用裸tcp来做,裸tcp会发生数据被分段传输以及数据粘包的现象,这部分说明参考workerman手册 http://doc.workerman.net/315124

  • 暂无评论
蜗牛

那我要在这个里面有时候需要传text,有时候需要传二进制流,这个链接里面我如何知道是哪种类型呢?谢谢。

  • 暂无评论
walkor

可以在头部再加一个字节来区分

  • 暂无评论
蜗牛

能否举个例子?
比如我和硬件协议的是
img:40142|二进制流内容+"\n"
txt:12|文本内容+"\n"

  • 暂无评论
蜗牛

我使用的也是php语言,那服务器端是如何接收数据呢?

class Frame
{
    public static function input($buffer ,TcpConnection $connection)
    {
        if(strlen($buffer)<4)
        {
            return 0;
        }
        $unpack_data = unpack('Ntotal_length', $buffer);
        return $unpack_data;
    }

    public static function decode($buffer)
    {
        return substr($buffer, 4);
    }

    public static function encode($buffer)
    {
        $total_length = 4 + strlen($buffer);
        return pack('N',$total_length) . $buffer;
    }
}

这个如何使用?

  • 暂无评论
walkor

请把worekrman手册看完吧。
手册里都有。
上面讲的都是在手册里的。

  • 暂无评论
蜗牛

http://doc.workerman.net/315125这个网址有说

但说到关键的地方:

use Workerman\Worker;
require_once '/your/path/Workerman/Autoloader.php'
$json_worker = new Worker('JsonNL://0.0.0.0:1234');
$json_worker->onMessage = ...
...

这个后面的内容也是
$tcp_worker->onMessage = function($connection, $data)
{
   //这里没说如何获取数据,难道就直接获取$data就可以取到二进制流的内容?
}
  • 暂无评论
蜗牛

老大人呢?

  • 暂无评论
xiuwang

是啊,$data就是要接受的内容。
老哥,你有提问等待这么长的时间为何不去自己试下呢?几分钟的事儿...

  • 暂无评论
年代过于久远,无法发表回答
🔝