Rumah  >  Artikel  >  rangka kerja php  >  Cara menggunakan Swoole untuk melaksanakan pelayan geganti TCP

Cara menggunakan Swoole untuk melaksanakan pelayan geganti TCP

WBOY
WBOYasal
2023-11-07 09:11:091398semak imbas

Cara menggunakan Swoole untuk melaksanakan pelayan geganti TCP

Swoole ialah rangka kerja komunikasi rangkaian berprestasi tinggi berdasarkan bahasa PHP Ia menyediakan ciri tak segerak, konkurensi, dipacu peristiwa dan lain serta menyokong TCP, UDP, HTTP. , WebSocket, dsb. protokol. Dalam artikel ini, kami akan meneroka cara menggunakan Swoole untuk melaksanakan pelayan geganti TCP, sambil memberikan contoh kod khusus.

Pelayan geganti TCP biasanya digunakan untuk memindahkan data pada rangkaian Contohnya, pelanggan A ingin menghantar data kepada pelanggan B yang lain, tetapi A dan B tidak boleh berkomunikasi secara langsung Pelayan geganti TCP untuk memajukan data.

Anda perlu memberi perhatian kepada perkara berikut semasa melaksanakan pelayan geganti TCP:

  1. Terima permintaan sambungan pelanggan dan buat sambungan yang sepadan
  2. Dengar Semua data yang disambungkan, majukan data ke sambungan sasaran
  3. Kendalikan situasi terputus sambungan, bersihkan sumber sambungan dalam masa

The berikut ditunjukkan melalui contoh khusus Cara menggunakan Swoole untuk melaksanakan pelayan geganti TCP.

Pertama, kami mentakrifkan tatasusunan untuk menyimpan maklumat bagi setiap sambungan pelanggan:

$clients = [];

Kemudian, cipta objek pelayan TCP Swoole dan tetapkan parameter yang berkaitan :

$server = new swoole_server("0.0.0.0", 9501);

$server->set([
    'worker_num' => 1,         //worker进程数
    'max_request' => 1000,     //每个worker最多处理1000个请求
    'dispatch_mode' => 2,      //使用固定模式
    'debug_mode' => 1,         //调试模式
]);

Apabila pelayan bermula, kami mendaftarkan fungsi panggil balik untuk mengendalikan acara sambungan:

$server->on('connect', function ($server, $fd) {
    echo "Client: Connect.
";
    //将连接信息存入数组
    $clients[$fd] = [
        'id' => $fd,
        'remote_ip' => $server->getClientInfo($fd)['remote_ip'],
        'remote_port' => $server->getClientInfo($fd)['remote_port'],
        'target_fd' => 0  //默认为0
    ];
});

Apabila pelanggan menyambung ke pelayan, "Pelanggan: Sambung" akan dikeluarkan ." bahagian ini maklumat, dan menyimpan maklumat sambungan klien ke dalam tatasusunan.

Seterusnya, kami mendaftarkan fungsi panggil balik untuk memproses data yang diterima:

$server->on('receive', function ($server, $fd, $from_id, $data) use (&$clients) {
    //如果还没有目标连接,则需要先选择一个
    if (empty($clients[$fd]['target_fd'])) {
        foreach ($clients as $client) {
            if ($client['id'] != $fd && empty($client['target_fd'])) {
                $clients[$fd]['target_fd'] = $client['id'];
                $clients[$client['id']]['target_fd'] = $fd;
                break;
            }
        }
    }

    //将数据转发到目标连接
    $server->send($clients[$fd]['target_fd'], $data);
});

Apabila terdapat penghantaran data, kandungan data akan diperolehi mengikut maklumat sambungan pelanggan, Cari sambungan sasaran yang tidak digunakan dan majukan data melalui sambungan sasaran.

Akhirnya, kami mendaftarkan fungsi panggil balik untuk mengendalikan acara pemutusan sambungan:

$server->on('close', function ($server, $fd) use (&$clients) {
    echo "Client: Close.
";
    //清理连接信息
    if (!empty($clients[$fd]['target_fd'])) {
        $target_fd = $clients[$fd]['target_fd'];
        $clients[$target_fd]['target_fd'] = 0;
    }
    unset($clients[$fd]);
});

Apabila sambungan pelanggan diputuskan, "Pelanggan: Tutup akan dikeluarkan maklumat dan membersihkan maklumat sambungan.

Di atas adalah pelaksanaan pelayan geganti TCP yang mudah Melalui contoh kod di atas, kita dapat melihat bahawa menggunakan Swoole untuk melaksanakan pelayan geganti TCP adalah sangat mudah. ​​Anda hanya perlu menentukan parameter yang berkaitan dan daftarkan fungsi panggil balik Dan tulis sahaja logik yang sepadan untuk setiap peristiwa.

Atas ialah kandungan terperinci Cara menggunakan Swoole untuk melaksanakan pelayan geganti TCP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn