Artikel ini akan memperkenalkan anda kepada contoh tentang paket tcp PHP melekat/membongkar saya harap ia akan membantu rakan yang memerlukan~
Dalam mod pautan panjang tcp. , Gunakan kaedah panjang pengepala mesej tetap untuk membongkar mesej untuk menyelesaikan masalah melekit. Protokol pengepala mesej tetap
membetulkan N bait pertama pengepala mesej sebagai bit panjang mesej Bergantung pada senario perniagaan, 2bait atau 4bait, apabila membaca mesej, mula-mula baca bit panjang mesej, dan kemudian. mengikut mesej tertentu Panjangnya membaca kandungan mesej. [Pembelajaran yang disyorkan: Tutorial video PHP]
bungkus/buka bungkusan boleh membungkus nilai ke dalam binari/membuka binari ke dalam nilai Untuk mod tertentu, sila rujuk pada pek/buka bungkusan untuk penggunaan terperinci. Di sini kita memilih tetap Panjang pengepala ialah 2 bait untuk mewakili panjang badan mesej Panjang maksimum badan mesej boleh diwakili oleh 2^16 - 1. Jika tidak mencukupi, anda boleh menggunakan 4 bait.
Kumpulkan pakej
<?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;
Patuhi pakej
// send // 传输 $package 由 $foo $bar 两条消息组成 模拟粘包场景 // receive
Buka bungkus
<?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;
Senario tcp yang sering ditemui dalam kerja harian mungkin mod mesej tunggal sambungan pendek Pelanggan menutup sambungan selepas menghantar mesej, dan pelayan membaca EOF dalam gelung untuk mendapatkan mesej yang lengkap. Walau bagaimanapun, jika terdapat berbilang mesej dalam sambungan pendek atau dalam mod pautan panjang, paket melekit mungkin berlaku dan pelanggan tidak boleh mengesahkan bahawa mesej telah dibaca melalui EOL tanpa menutup pelayan. Ini memerlukan penentuan protokol dan pembongkaran.
Atas ialah kandungan terperinci Kongsi contoh melekat/membongkar paket php tcp. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!