Php socket server пример

Сокеты: Сервер на PHP

Сокеты: Сервер на PHP

В предыдущей статье я рассказывал про сокеты на PHP. И сказал, что необходимо написать сервер, принимающий запросы и отдающий ответы. И клиента, посылающего запросы к серверу. В этой статье мы разберём код для классического сервера, принимающего число, возводящий его в квадрат и возвращающий результат клиенту.

Сразу привожу код сервера на PHP с подробными комментариями:

header(‘Content-Type: text/plain;’); //Мы будем выводить простой текст
set_time_limit(0); //Скрипт должен работать постоянно
ob_implicit_flush(); //Все echo должны сразу же отправляться клиенту
$address = ‘localhost’; //Адрес работы сервера
$port = 1985; //Порт работы сервера (лучше какой-нибудь редкоиспользуемый)
if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) //AF_INET - семейство протоколов
//SOCK_STREAM — тип сокета
//SOL_TCP — протокол
echo «Ошибка создания сокета»;
>
else echo «Сокет создан\n»;
>
//Связываем дескриптор сокета с указанным адресом и портом
if (($ret = socket_bind($sock, $address, $port)) < 0) echo "Ошибка связи сокета с адресом и портом";
>
else echo «Сокет успешно связан с адресом и портом\n»;
>
//Начинаем прослушивание сокета (максимум 5 одновременных соединений)
if (($ret = socket_listen($sock, 5)) < 0) echo "Ошибка при попытке прослушивания сокета";
>
else echo «Ждём подключение клиента\n»;
>
do //Принимаем соединение с сокетом
if (($msgsock = socket_accept($sock)) < 0) echo "Ошибка при старте соединений с сокетом";
> else echo «Сокет готов к приёму сообщений\n»;
>
$msg = «Hello!»; //Сообщение клиенту
echo «Сообщение от сервера: $msg»;
socket_write($msgsock, $msg, strlen($msg)); //Запись в сокет
//Бесконечный цикл ожидания клиентов
do echo ‘Сообщение от клиента: ‘;
if (false === ($buf = socket_read($msgsock, 1024))) echo «Ошибка при чтении сообщения от клиента»; >
else echo $buf.»\n»; //Сообщение от клиента
>
//Если клиент передал exit, то отключаем соединение
if ($buf == ‘exit’) socket_close($msgsock);
break 2;
>
if (!is_numeric($buf)) echo «Сообщение от сервера: передано НЕ число\n»;
else $buf = $buf * $buf;
echo «Сообщение от сервера: ($buf)\n»;
>
socket_write($msgsock, $buf, strlen($buf));
> while (true);
> while (true);
//Останавливаем работу с сокетом
if (isset($sock)) socket_close($sock);
echo «Сокет успешно закрыт»;
>
?>

Читайте также:  My css 3dn ru

Данный код я постарался тщательно прокомментировать, поэтому, надеюсь, Вам в нём всё понятно. Главное понять следующее: сервер — это непрерывно выполняющийся скрипт, который просто ждёт подключения клиентов. Затем принимающий запрос и на основании этого запроса, возвращающий клиенту ответ. Это самое главное, что Вам необходимо понять.

А в следующей статье мы с Вами напишем клиента на PHP, который и будет подключаться к данному серверу и отправлять различные запросы.

Создано 16.01.2012 14:51:02

  • Михаил Русаков
  • Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

    Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
    Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

    Если Вы не хотите пропустить новые материалы на сайте,
    то Вы можете подписаться на обновления: Подписаться на обновления

    Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

    Порекомендуйте эту статью друзьям:

    Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

    1. Кнопка:
      Она выглядит вот так:
    2. Текстовая ссылка:
      Она выглядит вот так: Как создать свой сайт
    3. BB-код ссылки для форумов (например, можете поставить её в подписи):

    Комментарии ( 14 ):

    У меня ошибка, пишет что функции socket_create нет.

    Надо включить эту библиотеку. Для этого в php.ini расскоментируйте строчку: extension=php_sockets.dll, затем перезапустите сервер.

    Надо включить эту библиотеку. Для этого в php.ini расскоментируйте строчку: extension=php_sockets.dll, затем перезапустите сервер. — Вот я всё по инструкции сделал,а оно мне:
    Fatal error: Call to undefined function socket_create() in Z:\home\localhost\www\server.php on line 7

    Дополнительные модули к Денверу установите (скачайте их с http://denwer.ru).

    А что нужно именно скачать,можна ссылку ))

    Дополнительные модули нужно скачать: http://www.denwer.ru/packages/php5.html

    Ваш совет помог мне включить поддержку сокетов на денвере,спасибо!

    После установки дополнительных модулей ошибка сохранилась.

    Все отлично, но вот есть вопрос: здесь если мы получили коннект клиента, то пока он не перестанет слать что либо серверу(здесь пока не пошлет exit), другие клиенты будут как бы в очереди и не будут обрабатываться. Есть варианты одновременной обработки нескольких клиентов?

    Скажите хоть. Надо ли запускать самостоятельно «server.php» или его просто надо разместить и он сам будет непрерывно работать! Опишите пожалуйста, Может из за денвера моего не х..на не работает!?

    Надо запускать и сам он непрерывно работать не будет.

    «Главное понять следующее: сервер — это непрерывно выполняющийся скрипт» Зачем тогда вообще эти сокеты нужны? Где они используются?

    Скажите пожалуйста, а как его запускать. этот сокет сервер на Денвере?

    Для добавления комментариев надо войти в систему.
    Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

    Copyright © 2010-2023 Русаков Михаил Юрьевич. Все права защищены.

    Источник

    Examples

    This example shows a simple talkback server. Change the address and port variables to suit your setup and execute. You may then connect to the server with a command similar to: telnet 192.168.1.53 10000 (where the address and port match your setup). Anything you type will then be output on the server side, and echoed back to you. To disconnect, enter ‘quit’.

    #!/usr/local/bin/php -q
    error_reporting ( E_ALL );

    /* Allow the script to hang around waiting for connections. */
    set_time_limit ( 0 );

    /* Turn on implicit output flushing so we see what we’re getting
    * as it comes in. */
    ob_implicit_flush ();

    $address = ‘192.168.1.53’ ;
    $port = 10000 ;

    if (( $sock = socket_create ( AF_INET , SOCK_STREAM , SOL_TCP )) === false ) echo «socket_create() failed: reason: » . socket_strerror ( socket_last_error ()) . «\n» ;
    >

    if ( socket_bind ( $sock , $address , $port ) === false ) echo «socket_bind() failed: reason: » . socket_strerror ( socket_last_error ( $sock )) . «\n» ;
    >

    if ( socket_listen ( $sock , 5 ) === false ) echo «socket_listen() failed: reason: » . socket_strerror ( socket_last_error ( $sock )) . «\n» ;
    >

    do if (( $msgsock = socket_accept ( $sock )) === false ) echo «socket_accept() failed: reason: » . socket_strerror ( socket_last_error ( $sock )) . «\n» ;
    break;
    >
    /* Send instructions. */
    $msg = «\nWelcome to the PHP Test Server. \n» .
    «To quit, type ‘quit’. To shut down the server type ‘shutdown’.\n» ;
    socket_write ( $msgsock , $msg , strlen ( $msg ));

    do if ( false === ( $buf = socket_read ( $msgsock , 2048 , PHP_NORMAL_READ ))) echo «socket_read() failed: reason: » . socket_strerror ( socket_last_error ( $msgsock )) . «\n» ;
    break 2 ;
    >
    if (! $buf = trim ( $buf )) continue;
    >
    if ( $buf == ‘quit’ ) break;
    >
    if ( $buf == ‘shutdown’ ) socket_close ( $msgsock );
    break 2 ;
    >
    $talkback = «PHP: You said ‘ $buf ‘.\n» ;
    socket_write ( $msgsock , $talkback , strlen ( $talkback ));
    echo » $buf \n» ;
    > while ( true );
    socket_close ( $msgsock );
    > while ( true );

    Example #2 Socket example: Simple TCP/IP client

    This example shows a simple, one-shot HTTP client. It simply connects to a page, submits a HEAD request, echoes the reply, and exits.

    echo «

    TCP/IP Connection

    \n» ;

    /* Get the port for the WWW service. */
    $service_port = getservbyname ( ‘www’ , ‘tcp’ );

    /* Get the IP address for the target host. */
    $address = gethostbyname ( ‘www.example.com’ );

    /* Create a TCP/IP socket. */
    $socket = socket_create ( AF_INET , SOCK_STREAM , SOL_TCP );
    if ( $socket === false ) echo «socket_create() failed: reason: » . socket_strerror ( socket_last_error ()) . «\n» ;
    > else echo «OK.\n» ;
    >

    echo «Attempting to connect to ‘ $address ‘ on port ‘ $service_port ‘. » ;
    $result = socket_connect ( $socket , $address , $service_port );
    if ( $result === false ) echo «socket_connect() failed.\nReason: ( $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 «Sending HTTP HEAD request. » ;
    socket_write ( $socket , $in , strlen ( $in ));
    echo «OK.\n» ;

    echo «Reading response:\n\n» ;
    while ( $out = socket_read ( $socket , 2048 )) echo $out ;
    >

    echo «Closing socket. » ;
    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» ;
    >

    Источник

    Оцените статью