Método __construct

void AsyncTcpConnection::__construct(string $remote_address, $context_option = null)

Crea un objeto de conexión asíncrona.

AsyncTcpConnection permite que Workerman inicie una conexión asíncrona como cliente hacia un servidor remoto, y maneje los datos de la conexión a través de la interfaz send y la devolución de llamada onMessage.

Parámetros

Parámetro: remote_address

La dirección de la conexión, por ejemplo
tcp://www.baidu.com:80
ssl://www.baidu.com:443
ws://echo.websocket.org:80
frame://192.168.1.1:8080
text://192.168.1.1:8080

Parámetro: $context_option

Este parámetro requiere (workerman >= 3.3.5)

Se utiliza para establecer el contexto del socket, por ejemplo, utilizando bindto para establecer la dirección IP y el puerto a través de los cuales se accede a la red externa, establecer certificados ssl, etc.

Consulta stream_context_create, Opciones del contexto de socket, Opciones del contexto SSL

Aviso

Actualmente, los protocolos soportados por AsyncTcpConnection son tcp, ssl, ws, frame, text.

También se soportan protocolos personalizados, consulta Cómo personalizar protocolos

El protocolo ssl requiere Workerman >= 3.3.4 y la instalación de la extensión openssl.

Actualmente, AsyncTcpConnection no soporta el protocolo http.

Puedes usar new AsyncTcpConnection('ws://...') para iniciar una conexión websocket con un servidor websocket remoto en Workerman, consulta Ejemplo. Sin embargo, no puedes iniciar una conexión websocket en Workerman usando la forma new AsyncTcpConnection('websocket://...').

Ejemplos

Ejemplo 1: Acceso asíncrono a un servicio http externo

use Workerman\Worker;
use Workerman\Connection\AsyncTcpConnection;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

$task = new Worker();
// Al iniciar el proceso, se crea de forma asíncrona un objeto de conexión a www.baidu.com y se envían datos para obtener información
$task->onWorkerStart = function($task)
{
    // No se soporta la especificación directa de http, pero se puede simular el protocolo http usando tcp para enviar datos
    $connection_to_baidu = new AsyncTcpConnection('tcp://www.baidu.com:80');
    // Cuando la conexión se establece con éxito, se envían datos de la solicitud http
    $connection_to_baidu->onConnect = function(AsyncTcpConnection $connection_to_baidu)
    {
        echo "conexión exitosa\n";
        $connection_to_baidu->send("GET / HTTP/1.1\r\nHost: www.baidu.com\r\nConnection: keep-alive\r\n\r\n");
    };
    $connection_to_baidu->onMessage = function(AsyncTcpConnection $connection_to_baidu, $http_buffer)
    {
        echo $http_buffer;
    };
    $connection_to_baidu->onClose = function(AsyncTcpConnection $connection_to_baidu)
    {
        echo "conexión cerrada\n";
    };
    $connection_to_baidu->onError = function(AsyncTcpConnection $connection_to_baidu, $code, $msg)
    {
        echo "Código de error:$code msg:$msg\n";
    };
    $connection_to_baidu->connect();
};

// Ejecutar worker
Worker::runAll();

Ejemplo 2: Acceso asíncrono a un servicio websocket externo, y especificar la ip y el puerto local para el acceso

<?php
use Workerman\Worker;
use Workerman\Connection\AsyncTcpConnection;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker();

$worker->onWorkerStart = function($worker) {
    // Si quieres iniciar la conexión solo en un proceso, puedes hacerlo verificando $worker->id, por ejemplo, a continuación se inicia la conexión solo en el proceso 0
    if ($worker->id != 0) {
        return;
    }
    // Establecer la ip y el puerto local para acceder al host remoto (cada conexión de socket ocupará un puerto local)
    $context_option = array(
        'socket' => array(
            // La ip debe ser la ip de la interfaz local y accesible al host remoto, de lo contrario, no tendrá efecto
            'bindto' => '114.215.84.87:2333',
        ),
    );

    $con = new AsyncTcpConnection('ws://echo.websocket.org:80', $context_option);

    $con->onConnect = function(AsyncTcpConnection $con) {
        $con->send('hola');
    };

    $con->onMessage = function(AsyncTcpConnection $con, $data) {
        echo $data;
    };

    $con->connect();
};

Worker::runAll();

Ejemplo 3: Acceso asíncrono a un puerto wss externo, y especificar un certificado ssl local

<?php
use Workerman\Worker;
use Workerman\Connection\AsyncTcpConnection;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker();

$worker->onWorkerStart = function($worker){
    // Establecer la ip y el puerto local para acceder al host remoto, así como el certificado ssl
    $context_option = array(
        'socket' => array(
            // La ip debe ser la ip de la interfaz local y accesible al host remoto, de lo contrario, no tendrá efecto
            'bindto' => '114.215.84.87:2333',
        ),
        // Opciones ssl, consulta https://php.net/manual/zh/context.ssl.php
        'ssl' => array(
            // Ruta del certificado local. Debe estar en formato PEM y contener el certificado y la clave privada locales.
            'local_cert'        => '/your/path/to/pemfile',
            // Contraseña del archivo local_cert.
            'passphrase'        => 'your_pem_passphrase',
            // Permitir certificados autofirmados.
            'allow_self_signed' => true,
            // Verificar el certificado SSL.
            'verify_peer'       => false
        )
    );

    // Iniciar conexión asíncrona
    $con = new AsyncTcpConnection('ws://echo.websocket.org:443', $context_option);

    // Establecer el acceso en modo ssl
    $con->transport = 'ssl';

    $con->onConnect = function(AsyncTcpConnection $con) {
        $con->send('hola');
    };

    $con->onMessage = function(AsyncTcpConnection $con, $data) {
        echo $data;
    };

    $con->connect();
};

Worker::runAll();