Примеры
Этот пример показывает работу простого сервера. Измените переменные address и port в соответствии с вашими настройками и выполните. Затем вы можете соединиться с сервером с командой, похожей на: telnet 192.168.1.53 10000 (где адрес и порт должны соответствовать вашим настройкам). Всё, что вы наберёте на клавиатуре, будет затем выведено на сервере и отправлено вам обратно. Для отключения наберите ‘выход’.
#!/usr/local/bin/php -q
error_reporting ( E_ALL );
/* Позволяет скрипту ожидать соединения бесконечно. */
set_time_limit ( 0 );
/* Включает скрытое очищение вывода так, что мы видим данные
* как только они появляются. */
ob_implicit_flush ();
$address = ‘192.168.1.53’ ;
$port = 10000 ;
if (( $sock = socket_create ( AF_INET , SOCK_STREAM , SOL_TCP )) === false ) echo «Не удалось выполнить socket_create(): причина: » . socket_strerror ( socket_last_error ()) . «\n» ;
>
if ( socket_bind ( $sock , $address , $port ) === false ) echo «Не удалось выполнить socket_bind(): причина: » . socket_strerror ( socket_last_error ( $sock )) . «\n» ;
>
if ( socket_listen ( $sock , 5 ) === false ) echo «Не удалось выполнить socket_listen(): причина: » . socket_strerror ( socket_last_error ( $sock )) . «\n» ;
>
do if (( $msgsock = socket_accept ( $sock )) === false ) echo «Не удалось выполнить socket_accept(): причина: » . socket_strerror ( socket_last_error ( $sock )) . «\n» ;
break;
>
/* Отправляем инструкции. */
$msg = «\nДобро пожаловать на тестовый сервер PHP. \n» .
«Чтобы отключиться, наберите ‘выход’. Чтобы выключить сервер, наберите ‘выключение’.\n» ;
socket_write ( $msgsock , $msg , strlen ( $msg ));
do if ( false === ( $buf = socket_read ( $msgsock , 2048 , PHP_NORMAL_READ ))) echo «Не удалось выполнить socket_read(): причина: » . socket_strerror ( socket_last_error ( $msgsock )) . «\n» ;
break 2 ;
>
if (! $buf = trim ( $buf )) continue;
>
if ( $buf == ‘выход’ ) break;
>
if ( $buf == ‘выключение’ ) socket_close ( $msgsock );
break 2 ;
>
$talkback = «PHP: Вы сказали ‘ $buf ‘.\n» ;
socket_write ( $msgsock , $talkback , strlen ( $talkback ));
echo » $buf \n» ;
> while ( true );
socket_close ( $msgsock );
> while ( true );
Пример #2 Пример использования сокетов: Простой клиент TCP/IP
Этот пример показывает использование простого одноразового HTTP-клиента. Он просто соединяется со страницей, отправляет запрос HEAD, выводит ответ и завершает работу.
echo «
Соединение TCP/IP
\n» ;
/* Получаем порт сервиса WWW. */
$service_port = getservbyname ( ‘www’ , ‘tcp’ );
/* Получаем IP-адрес целевого хоста. */
$address = gethostbyname ( ‘www.example.com’ );
/* Создаём сокет TCP/IP. */
$socket = socket_create ( AF_INET , SOCK_STREAM , SOL_TCP );
if ( $socket === false ) echo «Не удалось выполнить socket_create(): причина: » . socket_strerror ( socket_last_error ()) . «\n» ;
> else echo «OK.\n» ;
>
echo «Пытаемся соединиться с ‘ $address ‘ на порту ‘ $service_port ‘. » ;
$result = socket_connect ( $socket , $address , $service_port );
if ( $result === false ) echo «Не удалось выполнить socket_connect().\nПричина: ( $result ) » . socket_strerror ( socket_last_error ( $socket )) . «\n» ;
> else echo «OK.\n» ;
>
$in = «HEAD / HTTP/1.1\r\n» ;
$in .= «Host: www.example.com\r\n» ;
$in .= «Connection: Close\r\n\r\n» ;
$out = » ;
echo «Отправляем HTTP-запрос HEAD. » ;
socket_write ( $socket , $in , strlen ( $in ));
echo «OK.\n» ;
echo «Читаем ответ:\n\n» ;
while ( $out = socket_read ( $socket , 2048 )) echo $out ;
>
echo «Закрываем сокет. » ;
socket_close ( $socket );
echo «OK.\n\n» ;
?>
User Contributed Notes 3 notes
You can easily extend the first example to handle any number of connections instead of jsut one
#!/usr/bin/env php
error_reporting ( E_ALL );
/* Permitir al script esperar para conexiones. */
set_time_limit ( 0 );
/* Activar el volcado de salida implícito, así veremos lo que estamo obteniendo
* mientras llega. */
ob_implicit_flush ();
$address = ‘127.0.0.1’ ;
$port = 10000 ;
if (( $sock = socket_create ( AF_INET , SOCK_STREAM , SOL_TCP )) === false ) echo «socket_create() falló: razón: » . socket_strerror ( socket_last_error ()) . «\n» ;
>
if ( socket_bind ( $sock , $address , $port ) === false ) echo «socket_bind() falló: razón: » . socket_strerror ( socket_last_error ( $sock )) . «\n» ;
>
if ( socket_listen ( $sock , 5 ) === false ) echo «socket_listen() falló: razón: » . socket_strerror ( socket_last_error ( $sock )) . «\n» ;
>
//clients array
$clients = array();
do $read = array();
$read [] = $sock ;
$read = array_merge ( $read , $clients );
// Set up a blocking call to socket_select
if( socket_select ( $read , $write = NULL , $except = NULL , $tv_sec = 5 ) < 1 )
// SocketServer::debug(«Problem blocking socket_select?»);
continue;
>
// Handle new Connections
if ( in_array ( $sock , $read ))
if (( $msgsock = socket_accept ( $sock )) === false ) echo «socket_accept() falló: razón: » . socket_strerror ( socket_last_error ( $sock )) . «\n» ;
break;
>
$clients [] = $msgsock ;
$key = array_keys ( $clients , $msgsock );
/* Enviar instrucciones. */
$msg = «\nBienvenido al Servidor De Prueba de PHP. \n» .
«Usted es el cliente numero: < $key [ 0 ]>\n» .
«Para salir, escriba ‘quit’. Para cerrar el servidor escriba ‘shutdown’.\n» ;
socket_write ( $msgsock , $msg , strlen ( $msg ));
// Handle Input
foreach ( $clients as $key => $client ) < // for each client
if ( in_array ( $client , $read )) if ( false === ( $buf = socket_read ( $client , 2048 , PHP_NORMAL_READ ))) echo «socket_read() falló: razón: » . socket_strerror ( socket_last_error ( $client )) . «\n» ;
break 2 ;
>
if (! $buf = trim ( $buf )) continue;
>
if ( $buf == ‘quit’ ) unset( $clients [ $key ]);
socket_close ( $client );
break;
>
if ( $buf == ‘shutdown’ ) socket_close ( $client );
break 2 ;
>
$talkback = «Cliente < $key >: Usted dijo ‘ $buf ‘.\n» ;
socket_write ( $client , $talkback , strlen ( $talkback ));
echo » $buf \n» ;
>