Que dois-je faire si le swoole json est incomplet ?
swooleSolution au problème d'intégrité de l'envoi et de la réception de données entre le client et le serveur
1. Dans l'exemple suivant, après avoir démarré le service swoole, il écoute le port 9501 et reçoit les données de Les données envoyées par le client sont renvoyées inchangées.
class Server { private $serv; public function __construct() { $this->serv = new swoole_server("127.0.0.1", 9501); $this->serv->set(array( 'worker_num' => 4, //一般设置为服务器CPU数的1-4倍 'daemonize' => 1, //以守护进程执行 'max_request' => 2000, 'dispatch_mode' => 2,//进程数据包分配模式 1平均分配,2按FD取摸固定分配,3抢占式分配 'task_worker_num' => 8, //task进程的数量 "task_ipc_mode " => 3 , //使用消息队列通信,并设置为争抢模式 "log_file" => "./log/taskqueueu.log" ,//日志 )); $this->serv->on('Receive', array($this,'onReceive'));//接收到数据时回调此函数 $this->serv->start(); } public function onReceive(swoole_server $serv, $fd, $from_id, $data ) { $serv->send($fd, $data); usleep(500); //不加延时的话,经常两条数据被合并成一条返回了。 $serv->close($fd); } public function onClose(swoole_server $serv, $fd) { $serv->send($fd, 'CLOSED'); } }
Démarrez le serveur directement avec le nouveau serveur.
2. Démarrez le client swoole, envoyez les données au serveur et recevez le retour.
$client = new swoole_client(SWOOLE_SOCK_TCP); if (!$client->connect('127.0.0.1', 9501, -1)) { exit("connect failed. Error: {$client->errCode}\n"); } $data=[ 'type'=>1, 'data'=>array( 'PlatformCode'=>'...........很长的数据.', ) ]; $sender=$client->send(json_encode($data)."\r\n\r\n"); while($result = $client->recv()){ if($result=='CLOSED'){ echo "任务结束。byebye~\r\n"; break; }else{ echo $result; } } $client->close();
Lors de l'envoi d'un paquet de données relativement volumineux, vous constaterez que le paquet json reçu est incomplet. Cela peut être résolu en utilisant la méthode de traitement du protocole EOF, telle que le réglage sur le serveur :
$serv->set( array('open_eof_split' => TRUE, 'package_eof' => "\r\n\r\n") );
$server->set(array( 'open_length_check' => true, 'package_max_length' => 81920, 'package_length_type' => 'n', //see php pack() 'package_length_offset' => 0, 'package_body_offset' => 2, ));
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!