Im TCP-Long-Link-Modus wird die feste Nachrichtenkopflänge zum Entpacken der Nachricht verwendet, um das Sticky-Problem zu lösen.
Festes Nachrichten-Header-Protokoll
bestimmt die ersten N Bytes des Nachrichten-Headers als Nachrichtenlängenbits. In Kombination mit dem Geschäftsszenario, 2 Bytes oder 4 Bytes, wird beim Lesen der Nachricht die Nachrichtenlänge gelesen Bit zuerst Sie können den Nachrichteninhalt entsprechend der spezifischen Nachrichtenlänge lesen.
pack/unpack kann Werte in Binärdateien packen/Binärdateien in Werte entpacken. Informationen zu bestimmten Modi finden Sie in der detaillierten Verwendung von pack/unpack. Hier wählen wir eine feste Headerlänge von 2 Bytes zur Darstellung Die maximale Länge des Nachrichtenkörpers kann 2 ^16 - 1 Länge des Nachrichtenkörpers darstellen. Wenn dies nicht ausreicht, können Sie 4 Bytes verwenden.
Paketgruppierung
<?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;
Anhaftendes Paket
// send// 传输 $package 由 $foo $bar 两条消息组成 模拟粘包场景 // receive
Entpacken
<?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;
Ein TCP-Szenario, das bei der täglichen Arbeit häufig auftritt, kann der Modus einer kurzen Verbindungseinzelnachricht sein. Der Client schließt die Verbindung nach dem Senden einer Nachricht und der Server liest EOF in einer Schleife, um eine vollständige Nachricht zu erhalten. Wenn jedoch in einer kurzen Verbindung oder in einem langen Verbindungsmodus mehrere Nachrichten vorhanden sind, kann es zu Sticky-Paketen kommen, und der Client kann nicht bestätigen, dass die Nachricht über EOL gelesen wurde, ohne den Server zu schließen. Dies erfordert die Definition von Protokollen und das Entpacken.
Weitere technische Artikel zum Thema PHP finden Sie in der Spalte PHP-Tutorial, um mehr darüber zu erfahren!
Das obige ist der detaillierte Inhalt vonPHP – Beispiel für das Einkleben/Entpacken von TCP-Paketen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!