TCP, клиент службы UDP

В предыдущем разделе мы узнали, как настроить простые службы Http, TCP и UDP. Было ли вам очень легко и удобно создавать эти три сервиса в Swoole. Для клиента Http мы можем напрямую использовать браузер для тестирования или обычный Curl, Guzzle также может легко протестировать Http из кода. Поэтому не будем слишком много говорить о проблеме Http-клиента. Мы рассмотрим, как используется Http-клиент в сопрограмме, когда у нас будут дополнительные статьи по теме.

Сегодняшний контент в основном предназначен для клиентов TCP и UDP. В прошлой статье мы использовали инструменты командной строки telnet и nc для проверки работы этих двух сервисов, сегодня мы тестируем напрямую через клиентский объект Swoole.

TCP-клиент

В Swoole есть два типа клиентов: клиент с синхронной блокировкой и клиент сопрограммы, Сегодня мы просто узнаем о клиенте с синхронной блокировкой.

Что такое синхронная блокировка? На самом деле, это наш обычный код, который выполняется в порядке контекста, который мы пишем при традиционной разработке. Код выполняется сверху вниз по порядку, предыдущий код не выполняется, а последний код не запускается. Если функция встречается в середине, она войдет в функцию через метод обработки, подобный стеку, для обработки. По сути, на самом деле объектно-ориентированный метод программирования частично выпрыгивает из этого линейного режима выполнения кода, но все равно выполняется синхронно.

А такие вещи, как многопоточность и сопрограммы, фактически отделены от проблемы синхронной блокировки.У нас есть специальная статья, чтобы позже объяснить вопросы, связанные с процессами, потоками и сопрограммами. Сегодня каждый просто должен немного знать об этом. Или вы можете рассматривать код, который мы реализовали сегодня, как версию клиента Guzzle TCP/UDP, которая поставляется со Swoole.

$client = new Swoole\Client(SWOOLE_SOCK_TCP);
if (!$client->connect('127.0.0.1'9501-1)) {
   exit("connect failed. Error: {$client->errCode}\n");
}

$client->send("hello world\n");
echo $client->recv();
$client->close();

Реализация клиента TCP так же проста, как создание экземпляра объекта Swoole\Client. Его параметры построения могут быть переданы SWOOLE_SOCK_TCP или SWOOLE_SOCK_UDP и так далее. Как видно из названия, один из них является TCP-клиентом, а другой — UDP-клиентом.

Далее мы подключаемся через метод connect(), а подключение — это TCP-порт машины. Здесь мы можем напрямую запустить службу TCP в предыдущей статье.

Затем метод send() используется для отправки данных на сервер, метод recv() используется для получения информации, возвращаемой сервером, а метод last close() используется для закрытия дескриптора клиента.

Это очень просто, давайте запустим его.

[root@localhost source]# php 2.3Http、TCP、UDP服务客户端.php
Server TCP:hello world

Этот печатный контент — это данные, которые мы выводим на стороне сервера. Я считаю, что эта часть контента не должна быть сложной для всех. Перейдем непосредственно к UDP-клиенту.

UDP-клиент

Фактически, для UDP код реализации похож на приведенный выше TCP, и он более лаконичен. Почему? Все мы знаем, что TCP предназначен для установления стабильного соединения.Есть три рукопожатия и четыре взмаха рук, что также является базовым знанием TCP. А для UDP это не нужно, ему не нужно устанавливать стабильное соединение, поэтому шаг connect() в UDP можно опустить.

$client = new Swoole\Client(SWOOLE_SOCK_UDP);
$client->sendto('127.0.0.1'9501"hello world\n");
echo $client->recv();
$lient->close();

Достаточно просто, не так ли? Кроме того, здесь мы используем метод sendto(), который используется для отправки UDP-пакетов на произвольные адреса и порты. Конечно, здесь можно использовать connect() и отправлять UDP-данные через send() не проблема, можете попробовать сами.

[root@localhost source]# php 2.3Http、TCP、UDP服务客户端.php
Server UDP:hello world

другие методы

Наконец, давайте рассмотрим несколько других методов клиентских объектов.

var_dump($client->isConnected()); // bool(true)
// var_dump($client->getSocket());
var_dump($client->getsockname());
//array(2) {
//    ["port"]=>
//  int(47998)
//  ["host"]=>
//  string(9) "127.0.0.1"
//}

Первый isConnected() возвращает логическое значение того, подключен ли клиент. Предпосылка, конечно, заключается в том, что вызывается функция connect(), и соединение успешно устанавливается до того, как будет возвращено значение true.

getSocket() используется для возврата идентификатора ресурса дескриптора расширения сокета.В настоящее время в нашей системной среде не установлено расширение сокета, поэтому эту функцию пока нельзя использовать.

getockname() используется для получения локального хоста и порта клиентского сокета. В комментариях видно, что наша программа автоматически открыла порт 47998 локально для связи с TCP сервера.

Кроме того, в UDP мы можем использовать getpeername() для получения IP-адреса и порта однорангового сокета.

var_dump($client->getpeername());
//array(2) {
//    ["port"]=>
//  int(0)
//  ["host"]=>
//  string(7) "0.0.0.0"
//}

Этот метод поддерживает только соединения UPD, поскольку клиент связи по протоколу UDP отправляет пакет на сервер, возможно, сервер не отправляет ответ клиенту. IP-адрес сервера и ПОРТ фактического ответа можно получить с помощью метода getpeername(). Конечно, у нас в данный момент такой ситуации в этой машине нет, и прямая отдача вообще нулевая.

Подвести итог

В дополнение к вышеперечисленному, есть методы и функции, связанные с сертификатом, а также постоянные параметры для установления долгосрочных соединений. Вы можете найти их содержимое по ссылке официальной документации ниже. Я не буду здесь слишком много демонстрировать. В конце концов, это просто проводить всех через дверь, а не в моем стиле перемещать документы напрямую.

Что ж, мы закончили вводную демонстрацию трех наиболее важных сетевых служб и связанных с ними клиентов.В следующей статье мы познакомимся с еще одним популярным служебным приложением, которым является использование WebSocket.

Тестовый код:

https://github.com/zhangyue0503/swoole/blob/main/2.%E5%9F%BA%E7%A1%80/source/2.3Http%E3%80%81TCP%E3%80%81UDP%E6% 9C%8D%E5%8A%A1%E5%AE%A2%E6%88%B7%E7%AB%AF.php

Справочная документация:

https://wiki.swoole.com/#/клиент