Готовый перевод Mastering Swoole PHP: Build High Performance Concurrent System with Async and Coroutines / Осваиваем Swoole PHP: построение высокопроизводительной конкурентной системы с асинхронностью и корутинами: Разработка собственных протоколов TCP
Разработка собственных протоколов TCP
Мы можем разработать собственный протокол TCP с помощью удобного API, предоставляемого Swoole.
Представьте, что мы хотим транслировать данные в реальном времени с TCP-сервера всем подключенным к нему клиентам. Мы можем сериализовать данные в виде JSON, а затем добавим строку, содержащую длину пакета N с помощью функции PHP pack('N', $length).
<?php
$data=json_encode(array('key'=>'val'));
$packet=pack('N',strlen($data)).$data;
<?php
$server=newSwoole\Server("127.0.0.1",9503);
$server->on('connect',function($server,$fd){
echo"connection open:{$fd}\n";
go(function() {
while(1) {
if(!$server->exist($fd)) {
break;
}
$data=json_encode(array('time'=>time()));
$packet=pack('N',strlen($data)).$data;
$server->send($fd,$packet);
co::sleep(1);
}
});
});
$server->on('receive',function($server,$fd,$from_id,$data) {
});
$server->on('close',function($server,$fd) {
echo"connection close:{$fd}\n";
});
$server->start();
<?php
Co\run(function() {
go(function() {
$tcpclient=newSwoole\Coroutine\Client(SWOOLE_SOCK_TCP);
$tcpclient->set([
'open_length_check'=>1,
'package_length_type'=>'N',
'package_length_offset'=>0,
'package_body_offset'=>4,
]);
while(true) {
if(!$tcpclient->isConnected()) {
$tcpclient->connect('127.0.0.1',9090,0.5);
}
$packet=$tcpclient->recv() ;
if($packet) {
$json=substr($packet,4);
$data=json_decode($json);
var_dump($data);
}
}
});
});
Внимание! Этот перевод, возможно, ещё не готов.
Его статус: идёт перевод
Переведено на Нотабеноиде
http://notabenoid.org/book/81342/496985
Переводчики: bubenok
Настройки
Готово:
