問題如下:
客戶端發(fā)送一個100K左右的文件,每次發(fā)送1024長度的數(shù)據(jù),發(fā)送最后一個數(shù)據(jù)的時候把0xbbbb作為校驗位追加到數(shù)據(jù)結(jié)尾然后發(fā)送
服務(wù)器在text協(xié)議的input函數(shù)改為檢查0xbbbb位置,然后返回 return $pos+2;
我的理解是客戶端分多次把數(shù)據(jù)發(fā)送完,gatewayworker也是分包接收然后根據(jù)最后的校驗位0xbbbb作為包的結(jié)束。
可是在發(fā)送的時候,客戶端斷開了,gatewayworker也沒有收到完整的數(shù)據(jù)。所以想請教@walkor,gatewayworker在接受的時候是怎么處理的?怎樣解決接收大量數(shù)據(jù)完整性問題? 謝謝!
public static function input($buffer)
{
// 檢測0xbbbb位置(兩個字節(jié))
$check_byte = shorttobytes(48059);
$check = tostr($check_byte);
$pos = strpos($buffer, $check);
return $pos+2;
}
用的是text協(xié)議
這個是報錯信息
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
問題解決了,因為不小心誤刪了input中的
if($pos === false)
{
return 0;
}
發(fā)現(xiàn)自己好蠢,哎?。。?br />
我這幾天仔細(xì)查看了workerman協(xié)議部分的代碼,因為刪除了上面的代碼,所以客戶端傳輸大量數(shù)據(jù)的時候,$pos會返回false,所以客戶端會斷開。加上上面代碼后,就能循環(huán)接受大量數(shù)據(jù),直到接收到結(jié)尾符。
雖然是自己的疏忽造成的問題,但是通過這個問題,讓我更加了解workerman內(nèi)部的處理。
謝謝@walkor,一下子就知道了協(xié)議問題。非常感謝!很好的框架!