我想請(qǐng)問(wèn)一下這個(gè)方法如果用來(lái)接收二進(jìn)制流數(shù)據(jù)的,每次接收多少字節(jié),還有我如何才知道這個(gè)二進(jìn)制流數(shù)據(jù)是否已經(jīng)傳輸完畢呢?謝謝。
workerman支持自定義通訊協(xié)議,每次接收多少字節(jié)是自己根據(jù)協(xié)議來(lái)確定的。
一般協(xié)議頭里包含了這個(gè)包的大小。
通訊協(xié)議參考手冊(cè) http://doc.workerman.net/315123
我現(xiàn)在是這樣使用的。
$tcp_worker = new Worker("tcp://0.0.0.0:8333");
$tcp_worker->onMessage = function($connection, $data)
{
//但這個(gè)$data是每次都只獲取一點(diǎn)數(shù)據(jù),而不是所有的數(shù)據(jù),那我如何知道它這次有沒(méi)傳輸出完成?
}
可以參考frame協(xié)議的方式,將包長(zhǎng)放到包的頭部,也就是前4個(gè)字節(jié)是網(wǎng)絡(luò)字節(jié)序的整數(shù)。
frame協(xié)議實(shí)現(xiàn)參考手冊(cè)。http://doc.workerman.net/315308 ,其中打包解包都有。
workerman里協(xié)議設(shè)定很簡(jiǎn)單,類似這樣
// tcp改成frame
$tcp_worker = new Worker("frame://0.0.0.0:8333");
$tcp_worker->onMessage = function($connection, $data)
{
///這里$data會(huì)是完整的數(shù)據(jù)
}
客戶端frame實(shí)現(xiàn)根據(jù)客戶端語(yǔ)言而定。我這里沒(méi)有其它語(yǔ)言的例子。
一般長(zhǎng)連接通訊中不能使用裸tcp來(lái)做,裸tcp會(huì)發(fā)生數(shù)據(jù)被分段傳輸以及數(shù)據(jù)粘包的現(xiàn)象,這部分說(shuō)明參考workerman手冊(cè) http://doc.workerman.net/315124
那我要在這個(gè)里面有時(shí)候需要傳text,有時(shí)候需要傳二進(jìn)制流,這個(gè)鏈接里面我如何知道是哪種類型呢?謝謝。
能否舉個(gè)例子?
比如我和硬件協(xié)議的是
img:40142|二進(jìn)制流內(nèi)容+"\n"
txt:12|文本內(nèi)容+"\n"
我使用的也是php語(yǔ)言,那服務(wù)器端是如何接收數(shù)據(jù)呢?
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;
}
}
這個(gè)如何使用?
http://doc.workerman.net/315125這個(gè)網(wǎng)址有說(shuō),
但說(shuō)到關(guān)鍵的地方:
use Workerman\Worker;
require_once '/your/path/Workerman/Autoloader.php'
$json_worker = new Worker('JsonNL://0.0.0.0:1234');
$json_worker->onMessage = ...
...
這個(gè)后面的內(nèi)容也是
$tcp_worker->onMessage = function($connection, $data)
{
//這里沒(méi)說(shuō)如何獲取數(shù)據(jù),難道就直接獲取$data就可以取到二進(jìn)制流的內(nèi)容?
}
是啊,$data就是要接受的內(nèi)容。
老哥,你有提問(wèn)等待這么長(zhǎng)的時(shí)間為何不去自己試下呢?幾分鐘的事兒...