Was soll ich tun, wenn der Swoole-JSON unvollständig ist?
swooleLösung für das Integritätsproblem beim Senden und Empfangen von Daten zwischen Client und Server
1. Im folgenden Beispiel wird nach dem Start des Swoole-Dienstes Folgendes angezeigt: lauscht auf Port 9501 und empfängt Daten von Die vom Client gesendeten Daten werden unverändert zurückgegeben.
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'); } }
Starten Sie den Server direkt mit dem neuen Server.
2. Starten Sie den Swoole-Client, senden Sie Daten an den Server und empfangen Sie die Rückgabe.
$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();
Wenn Sie ein relativ großes Datenpaket senden, werden Sie feststellen, dass das empfangene JSON-Paket unvollständig ist. Dies kann durch die Verwendung der EOF-Protokollverarbeitungsmethode gelöst werden, z. B. durch die Einstellung auf dem Server:
$serv->set( array('open_eof_split' => TRUE, 'package_eof' => "\r\n\r\n") );
Auf diese Weise wird „rnrn“ zum Endzeichen des EOF-Protokolls.
Wenn Sie ein Datenpaket senden, fügen Sie am Ende des Pakets „rnrn“ hinzu. Wenn dieses Zeichen beim Auftreffen auf die Schnittstellendaten auftritt, wird davon ausgegangen, dass die Daten empfangen wurden, wodurch die Integrität sichergestellt wird die Daten.
Hinweis: Das Zeichen „rnrn“ darf nicht im Datenpaket vorkommen, da sonst ein Unterpaketfehler auftritt.
Swooles Server und asynchroner Client verarbeiten beide Datenpakete in der onReceive-Callback-Funktion. Wenn die Protokollverarbeitung eingestellt ist, wird das onReceive-Ereignis nur ausgelöst, wenn ein vollständiges Datenpaket empfangen wird.
Auf andere Weise können Sie auch die Länge des zu sendenden Pakets voreinstellen, z. B.:
$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, ));
Sie können die Länge des Pakets festlegen, um die Integrität der Daten sicherzustellen. Der offizielle Kommentar lautet wie folgt:
Das Protokoll mit festen Headern ist sehr verbreitet und kann oft in BAT-Serverprogrammen gesehen werden. Das Besondere an diesem Protokoll ist, dass ein Datenpaket immer aus 2 Teilen besteht: Header + Body. Der Paket-Header verfügt über ein Feld, das die Länge des Paketkörpers oder des gesamten Pakets angibt. Die Länge wird im Allgemeinen durch eine 2-Byte-/4-Byte-Ganzzahl dargestellt. Nachdem der Server den Paket-Header empfangen hat, kann er anhand des Längenwerts genau steuern, wie viele weitere Daten er empfangen muss, um ein vollständiges Datenpaket zu erhalten. Die Konfiguration von Swoole kann dieses Protokoll sehr gut unterstützen und vier Parameter flexibel einstellen, um allen Situationen gerecht zu werden.
Swooles Server und asynchroner Client verarbeiten beide Datenpakete in der onReceive-Callback-Funktion. Wenn die Protokollverarbeitung eingestellt ist, wird das onReceive-Ereignis nur ausgelöst, wenn ein vollständiges Datenpaket empfangen wird. Nachdem der Synchronisierungsclient die Protokollverarbeitung eingerichtet hat, ist beim Aufruf von $client->recv() keine Übergabe der Länge mehr erforderlich. Die Funktion recv kehrt nach dem Empfang des vollständigen Pakets zurück, andernfalls tritt ein Fehler auf.
Das obige ist der detaillierte Inhalt vonWas tun, wenn Swoole JSON unvollständig ist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!