客户端往gatewayworker发送txt文件流,接收时报错

bijingjieshen

问题如下:
客户端发送一个100K左右的文件,每次发送1024长度的数据,发送最后一个数据的时候把0xbbbb作为校验位追加到数据结尾然后发送

服务器在text协议的input函数改为检查0xbbbb位置,然后返回 return $pos+2;

我的理解是客户端分多次把数据发送完,gatewayworker也是分包接收然后根据最后的校验位0xbbbb作为包的结束。

可是在发送的时候,客户端断开了,gatewayworker也没有收到完整的数据。所以想请教@walkor,gatewayworker在接受的时候是怎么处理的?怎样解决接收大量数据完整性问题? 谢谢!

3599 6 0
6个回答

walkor

协议实现贴一下,应该是写错了,或者客户端发错了

  • 暂无评论
bijingjieshen
public static function input($buffer)
{
    // 检测0xbbbb位置(两个字节)
    $check_byte = shorttobytes(48059);
    $check = tostr($check_byte);
    $pos = strpos($buffer, $check);

    return $pos+2;
}

用的是text协议

  • 暂无评论
bijingjieshen

还有一个问题就是数据量很小的txt可以成功接收到,但是数据量一大就会出现上面的接收问题。

  • 暂无评论
bijingjieshen

这个是报错信息
SendBufferToWorker fail. May be the send buffer are overflow. See http://wiki.workerman.net/Error2 for detail
SendBufferToWorker fail. The connections between Gateway and BusinessWorker are not ready. See http://wiki.workerman.net/Error3 for detail
worker exit with status 64000

  • 暂无评论
bijingjieshen

问题解决了,因为不小心误删了input中的

if($pos === false)
{
    return 0;
}

发现自己好蠢,哎!!!
我这几天仔细查看了workerman协议部分的代码,因为删除了上面的代码,所以客户端传输大量数据的时候,$pos会返回false,所以客户端会断开。加上上面代码后,就能循环接受大量数据,直到接收到结尾符。
虽然是自己的疏忽造成的问题,但是通过这个问题,让我更加了解workerman内部的处理。
谢谢@walkor,一下子就知道了协议问题。非常感谢!很好的框架!

  • 暂无评论
walkor

不客气

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