Maison > Article > développement back-end > php - exemple de collage/déballage de paquets TCP
En mode lien long TCP, la longueur d'en-tête de message fixe est utilisée pour le déballage du message afin de résoudre le problème persistant.
Protocole d'en-tête de message fixe
fixe les N premiers octets de l'en-tête du message comme bits de longueur du message. Combiné avec le scénario métier, 2 octets ou 4 octets, lors de la lecture du message, lisez la longueur du message. bit en premier. Vous pouvez lire le contenu du message en fonction de la longueur spécifique du message.
pack/unpack peut regrouper les valeurs en binaire/décompresser les binaires en valeurs. Pour des modes spécifiques, veuillez vous référer à l'utilisation détaillée de pack/unpack. Ici, nous choisissons une longueur d'en-tête fixe de 2 octets pour représenter le. longueur du corps du message. Le maximum peut représenter 2 ^16 - 1 longueur du corps du message, si cela ne suffit pas, vous pouvez utiliser 4 octets.
Paquets groupés
<?php// msg protocol// | ---- dataLen ---- | data |// | - fixed 2bytes - |// 模拟客户端连续发送2条消息$foo = "hello world"; $bar = "i am sqrt_cat"; $package = "";// 使用 n 打包 固定2bytes$fooLenn = pack("n", strlen($foo)); $package = $fooLenn . $foo; $barLenn = pack("n", strlen($bar)); $package .= $barLenn . $bar;
Paquets bâtons
// send// 传输 $package 由 $foo $bar 两条消息组成 模拟粘包场景 // receive
Déballer
<?php // 解析第1条消息 取前 2bytes 按 n 解包 $fooLen = unpack("n", substr($package, 0, 2))[1]; // 使用包消息体长度定义读取消息体 // 从第 3byte 开始读 前 2bytes表示长度 $foo = substr($package, 2, $fooLen); echo $foo . PHP_EOL; // 解析第2条消息 取前 2bytes 按 n 解包 // 0 ~ (2 + fooLen) - 1 字节序为 fooLen . foo // (2 + fooLen) ~ (2 + fooLen) + 2 - 1 为 barLen $barLen = unpack("n", substr($package, (2 + $fooLen), 2))[1]; $bar = substr($package, (2 + $fooLen) + 2, $barLen); echo $bar . PHP_EOL;
Un scénario TCP souvent rencontré dans le travail quotidien peut être le mode de connexion courte à un seul message, le client ferme la connexion après l'envoi d'un message et le serveur lit EOF en boucle pour obtenir un message complet. Cependant, s'il y a plusieurs messages dans une connexion courte ou dans un mode de connexion longue, des paquets persistants peuvent se produire et le client ne peut pas confirmer que le message a été lu via EOL sans fermer le serveur. Cela nécessite de définir des protocoles et de déballer.
Pour plus d'articles techniques liés à PHP, veuillez visiter la colonne Tutoriel PHP pour apprendre !
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!