Comencemos con un ejemplo simple: un servicio TCP que recibe una cadena de entrada, procesa y devuelve esta cadena al cliente. Aquí está el código correspondiente:
Código PHP:
<?
// 设置一些基本的变量
$host = "192.168.1.99" ;
$port = 1234 ;
// 设置超时时间
set_time_limit ( 0 );
// 创建一个Socket
$socket = socket_create ( AF_INET , SOCK_STREAM , 0 ) or die( "Could not create
socketn" );
//绑定Socket到端口
$result = socket_bind ( $socket , $host , $port ) or die( "Could not bind to
socketn" );
// 开始监听链接
$result = socket_listen ( $socket , 3 ) or die( "Could not set up socket
listenern" );
// accept incoming connections
// 另一个Socket来处理通信
$spawn = socket_accept ( $socket ) or die( "Could not accept incoming
connectionn" );
// 获得客户端的输入
$input = socket_read ( $spawn , 1024 ) or die( "Could not read inputn" );
// 清空输入字符串
$input = trim ( $input );
//处理客户端输入并返回结果
$output = strrev ( $input ) . "n" ;
socket_write ( $spawn , $output , strlen ( $output )) or die( "Could not write
outputn" );
// 关闭sockets
socket_close ( $spawn );
socket_close ( $socket );
?>
La siguiente es una descripción detallada de cada paso:
1. El primer paso es crear dos variables para guardar la dirección IP y el puerto del servidor donde se ejecuta el Socket. Puede configurarlo en su propio servidor y puerto (este puerto puede ser un número entre 1 y 65535), siempre que que este puerto no se utiliza.
Código PHP:
<?
// 设置两个变量
$host = "192.168.1.99" ;
$port = 1234 ;
?>
2. Puede utilizar la función set_time_out() en el lado del servidor para asegurarse de que PHP no expire mientras espera que el cliente se conecte.
Código PHP:
<?
// 超时时间
set_time_limit ( 0 );
?>
3. Basado en los anteriores, es hora de crear un Socket usando la función socket_creat() --- esta función devuelve un identificador de Socket, que se usará en todas las funciones posteriores.
Código PHP:
<?
// 创建Socket
$socket = socket_create ( AF_INET , SOCK_STREAM , 0 ) or die( "Could not create socketn" );
?>
El primer parámetro "AF_INET" se utiliza para especificar el nombre de dominio;
El segundo parámetro "SOCK_STREM" le dice a la función qué tipo de Socket se creará (tipo TCP en este ejemplo)
Por lo tanto, si desea crear un socket UDP, puede utilizar el siguiente código:
Código PHP:
<?
// 创建socket
$socket = socket_create ( AF_INET , SOCK_DGRAM , 0 ) or die( "Could not create socketn" );
?>
4. Una vez que se crea un identificador de Socket, el siguiente paso es especificarlo o vincularlo a la dirección y el puerto especificados. Esto se puede hacer a través de la función socket_bind().
Código PHP:
<?
// 绑定socket to 指定地址和端口
$result = socket_bind ( $socket , $host , $port ) or die( "Could not bind to socketn" );
?>
5. Después de crear el socket y vincularlo a un puerto, puede comenzar a escuchar conexiones externas. PHP le permite iniciar una escucha a través de la función socket_listen() y puede especificar un número (en este ejemplo, es el segundo). parámetro: 3)
Código PHP:
<?
// 开始监听连接
$result = socket_listen ( $socket , 3 ) or die( "Could not set up socket listenern" );
?>
6. Hasta ahora, su servidor básicamente no ha hecho nada excepto esperar una solicitud de conexión del cliente. Una vez que se recibe la conexión del cliente, la función socket_assept() entra en juego. Recibe la solicitud de conexión y llama a otra sub-. Socket maneja la información cliente-servidor.
Código PHP:
<?
//接受请求链接
// 调用子socket 处理信息
$spawn = socket_accept ( $socket ) or die( "Could not accept incoming connectionn" );
?>
Este subsocket ahora se puede utilizar para la comunicación posterior cliente-servidor.
7. Cuando se establece una conexión, el servidor esperará a que el cliente envíe alguna información de entrada. Esta información puede obtenerse mediante la función socket_read() y asignarse a la variable $input de PHP.
Código PHP:
<?
// 读取客户端输入
$input = socket_read ( $spawn , 1024 ) or die( "Could not read inputn" );
?>
El segundo parámetro de socker_read se usa para especificar la cantidad de bytes que se leerán. Puede usarlo para limitar el tamaño de los datos obtenidos del cliente.
Nota: La función socket_read continuará leyendo los datos del cliente shell hasta que encuentre los caracteres n, t o . El script PHP considera estos caracteres como el final de la entrada.
8. Ahora el servidor debe procesar los datos enviados por el cliente (en este ejemplo, el procesamiento solo incluye la entrada y devolución de datos al cliente. Esta parte se puede completar mediante la función socket_write() (para que los datos enviados). por el socket de comunicación es posible devolver un flujo de datos al cliente)
Código PHP:
<?
// 处理客户端输入并返回数据
$output = strrev ( $input ) . "n" ;
socket_write ( $spawn , $output , strlen ( $output )) or die( "Could not write outputn" );
?>
9. Una vez que la salida se devuelve al cliente, el socket principal/secundario debe terminarse mediante la función socket_close()
Código PHP:
<?
// 关闭sockets
socket_close ( $spawn );
socket_close ( $socket );
?>