TCP, cliente de servicio UDP

En la sección anterior, aprendimos cómo configurar servicios simples Http, TCP y UDP. ¿Le resultó muy fácil y conveniente crear estos tres servicios en Swoole? Para el cliente Http, podemos usar directamente el navegador para probar, o Curl normal, Guzzle también puede probar fácilmente Http desde el código. Por tanto, no hablaremos demasiado del problema del cliente Http. Echaremos un vistazo a cómo se usa el cliente Http en la rutina cuando tengamos artículos relacionados avanzados.

El contenido de hoy es principalmente para clientes TCP y UDP. En el último artículo, usamos las herramientas de línea de comando telnet y nc para probar el funcionamiento de estos dos servicios, hoy lo probamos directamente a través del objeto cliente de Swoole.

cliente TCP

En Swoole, hay dos tipos de clientes: cliente de bloqueo síncrono y cliente coroutine.Hoy aprenderemos simplemente sobre el cliente de bloqueo síncrono.

¿Qué es el bloqueo sincrónico? De hecho, es nuestro código normal el que se ejecuta en el orden del contexto, que es el tipo de código que escribimos en el desarrollo tradicional. El código se ejecuta de arriba a abajo en orden, el código anterior no se ejecuta y el último código no se ejecutará. Si se encuentra una función en el medio, ingresará a la función a través de un método de procesamiento similar a una pila para el procesamiento. En esencia, de hecho, el método de programación orientada a objetos salta parcialmente de este modo de ejecución de código lineal, pero todavía se ejecuta de forma síncrona.

Y cosas como los subprocesos múltiples y las corrutinas en realidad están separadas del problema del bloqueo síncrono. Tenemos un artículo especial para explicar los problemas relacionados con los procesos, los subprocesos y las corrutinas más adelante. Hoy en día, todo el mundo necesita saber un poco al respecto. O bien, puede tratar el código que implementamos hoy como una versión de cliente Guzzle TCP/UDP que viene con 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();

Implementar un cliente TCP es tan simple como instanciar un objeto Swoole\Client. Sus parámetros de construcción se pueden pasar SWOOLE_SOCK_TCP o SWOOLE_SOCK_UDP y así sucesivamente. Como puede verse por el nombre, uno es un cliente TCP y el otro es un cliente UDP.

A continuación, nos conectamos mediante el método connect(), y la conexión es el puerto TCP de la máquina. Aquí podemos iniciar directamente el servicio TCP del artículo anterior.

Luego, el método send() se usa para enviar datos al servidor, el método recv() se usa para recibir la información devuelta por el servidor y el último método close() se usa para cerrar el identificador del cliente.

Es muy simple, vamos a ejecutarlo.

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

Este contenido impreso son los datos que generamos en el lado del servidor. Creo que este contenido no debería ser difícil para todos. Vayamos directamente al cliente UDP.

cliente UDP

Para UDP, de hecho, su código de implementación es similar al TCP anterior y es más conciso. ¿por qué? Todos sabemos que TCP es para establecer una conexión estable. Hay tres apretones de manos y cuatro ondas de manos, que también es el conocimiento básico de TCP. Y UDP no lo necesita, no necesita establecer una conexión estable, por lo que podemos omitir el paso de conectar() en UDP.

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

Bastante simple, ¿verdad? Además, aquí estamos usando el método sendto(), que se usa para enviar paquetes UDP a direcciones y puertos arbitrarios. Por supuesto, puede usar connect() aquí y enviar datos UDP a través de send() no hay problema, puede intentarlo usted mismo.

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

otros metodos

Finalmente, veamos algunos otros métodos de objetos de cliente.

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"
//}

El primero isConnected() devuelve un valor booleano de si el cliente está conectado. La premisa, por supuesto, es que se llama a connect() y la conexión se establece con éxito antes de devolver verdadero.

getSocket() se usa para devolver un identificador de recurso de identificador de extensión de socket Actualmente, no hay una extensión de socket instalada en nuestro entorno de sistema, por lo que esta función no se puede usar todavía.

getsockname() se usa para obtener el host local y el puerto del socket del cliente. Puede ver en los comentarios que nuestro programa abrió automáticamente el puerto 47998 localmente para la comunicación con el servidor TCP.

Además, en UDP, podemos usar getpeername() para obtener la dirección IP y el puerto del socket par.

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

Este método solo admite conexiones UPD, ya que el cliente de comunicación del protocolo UDP envía un paquete a un servidor, es posible que no sea el servidor el que envíe una respuesta al cliente. La IP del servidor y el PUERTO de la respuesta real se pueden obtener mediante el método getpeername(). Por supuesto, actualmente no tenemos esta situación en esta máquina, y el retorno directo es todo cero.

Resumir

Además del contenido anterior, también hay métodos y funciones relacionadas con los certificados, y también hay parámetros constantes para establecer conexiones a largo plazo. Puede encontrar estos contenidos en el enlace de documentación oficial a continuación. No haré demasiada demostración aquí. . Después de todo, es solo para llevar a todos a través de la puerta, y no es mi estilo mover documentos directamente.

Bueno, hemos terminado la demostración introductoria de los tres servicios de red más importantes y los clientes relacionados. En el próximo artículo, aprenderemos otra aplicación de servicio popular, que es el uso de WebSocket.

Código de prueba:

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

Documentación de referencia:

https://wiki.swoole.com/#/cliente