Начнем с простого примера — TCP-сервис, который получает входную строку, обрабатывает и возвращает эту строку клиенту. Вот соответствующий код:
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 );
?>
Ниже приводится подробное описание каждого шага:
1. Первым шагом является создание двух переменных для сохранения IP-адреса и порта сервера, на котором работает Socket. Вы можете установить для него свой собственный сервер и порт (этот порт может быть числом от 1 до 65535), если это указано. что этот порт не используется.
PHP-код:
<?
// 设置两个变量
$host = "192.168.1.99" ;
$port = 1234 ;
?>
2. Вы можете использовать функцию set_time_out() на стороне сервера, чтобы гарантировать, что PHP не истечет тайм-аут во время ожидания подключения клиента.
PHP-код:
<?
// 超时时间
set_time_limit ( 0 );
?>
3. Исходя из предыдущих, пришло время создать Socket с помощью функции socket_creat() --- эта функция возвращает дескриптор Socket, который будет использоваться во всех последующих функциях.
PHP-код:
<?
// 创建Socket
$socket = socket_create ( AF_INET , SOCK_STREAM , 0 ) or die( "Could not create socketn" );
?>
Первый параметр «AF_INET» используется для указания имени домена;
Второй параметр «SOCK_STREM» сообщает функции, какой тип сокета будет создан (тип TCP в этом примере).
Поэтому, если вы хотите создать UDP-сокет, вы можете использовать следующий код:
PHP-код:
<?
// 创建socket
$socket = socket_create ( AF_INET , SOCK_DGRAM , 0 ) or die( "Could not create socketn" );
?>
4. После создания дескриптора сокета следующим шагом будет указание или привязка его к указанному адресу и порту. Это можно сделать с помощью функции socket_bind().
PHP-код:
<?
// 绑定socket to 指定地址和端口
$result = socket_bind ( $socket , $host , $port ) or die( "Could not bind to socketn" );
?>
5. После того, как сокет создан и привязан к порту, вы можете начать прослушивание внешних соединений. PHP позволяет вам начать прослушивание через функцию сокета_listen(), и вы можете указать номер (в этом примере это второй). параметр: 3)
PHP-код:
<?
// 开始监听连接
$result = socket_listen ( $socket , 3 ) or die( "Could not set up socket listenern" );
?>
6. До сих пор ваш сервер практически ничего не делал, кроме ожидания запроса на соединение от клиента. Как только клиентское соединение получено, в игру вступает функция socket_assept(). Она получает запрос на соединение и вызывает другую подпрограмму. Сокет обрабатывает информацию клиент-сервер.
PHP-код:
<?
//接受请求链接
// 调用子socket 处理信息
$spawn = socket_accept ( $socket ) or die( "Could not accept incoming connectionn" );
?>
Теперь этот подсокет можно использовать для последующего взаимодействия клиент-сервер.
7. Когда соединение установлено, сервер будет ждать, пока клиент отправит некоторую входную информацию. Эту информацию можно получить с помощью функцииocket_read() и присвоить переменной $input PHP.
PHP-код:
<?
// 读取客户端输入
$input = socket_read ( $spawn , 1024 ) or die( "Could not read inputn" );
?>
Второй параметр socker_read используется для указания количества читаемых байт. Вы можете использовать его для ограничения размера данных, получаемых от клиента.
Примечание. Функция socket_read будет продолжать читать данные клиента оболочки до тех пор, пока не встретит символы n, t или . PHP-скрипт рассматривает эти символы как конец ввода.
8. Теперь сервер должен обработать данные, отправленные клиентом (в этом примере обработка включает только ввод и возврат данных клиенту. Эту часть можно выполнить с помощью функции socket_write() (чтобы данные были отправлены). по коммуникационному сокету можно вернуть поток данных клиенту)
PHP-код:
<?
// 处理客户端输入并返回数据
$output = strrev ( $input ) . "n" ;
socket_write ( $spawn , $output , strlen ( $output )) or die( "Could not write outputn" );
?>
9. Как только выходные данные будут возвращены клиенту, родительский/дочерний сокет должен быть завершен с помощью функции socket_close().
PHP-код:
<?
// 关闭sockets
socket_close ( $spawn );
socket_close ( $socket );
?>