Vamos começar com um exemplo simples - um serviço TCP que recebe uma string de entrada, processa e retorna essa string ao cliente. Aqui está o código correspondente:
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 );
?>
A seguir está uma descrição detalhada de cada etapa:
1. O primeiro passo é criar duas variáveis para salvar o endereço IP e a porta do servidor onde o Socket está rodando. Você pode configurá-lo para seu próprio servidor e porta (esta porta pode ser um número entre 1 e 65535), desde que. que esta porta Não usado.
Código PHP:
<?
// 设置两个变量
$host = "192.168.1.99" ;
$port = 1234 ;
?>
2. Você pode usar a função set_time_out() no lado do servidor para garantir que o PHP não expire enquanto espera a conexão do cliente.
Código PHP:
<?
// 超时时间
set_time_limit ( 0 );
?>
3. Com base nas anteriores, é hora de criar um Socket usando a função socket_creat() --- esta função retorna um identificador de Socket, que será usado em todas as funções subsequentes.
Código PHP:
<?
// 创建Socket
$socket = socket_create ( AF_INET , SOCK_STREAM , 0 ) or die( "Could not create socketn" );
?>
O primeiro parâmetro "AF_INET" é usado para especificar o nome de domínio;
O segundo parâmetro "SOCK_STREM" informa à função qual tipo de Socket será criado (tipo TCP neste exemplo)
Portanto, se você deseja criar um soquete UDP, pode usar o seguinte código:
Código PHP:
<?
// 创建socket
$socket = socket_create ( AF_INET , SOCK_DGRAM , 0 ) or die( "Could not create socketn" );
?>
4. Depois que um identificador de soquete for criado, a próxima etapa é especificá-lo ou vinculá-lo ao endereço e porta especificados. Isso pode ser feito através da função socket_bind().
Código PHP:
<?
// 绑定socket to 指定地址和端口
$result = socket_bind ( $socket , $host , $port ) or die( "Could not bind to socketn" );
?>
5. Após o Socket ser criado e vinculado a uma porta, você pode começar a escutar conexões externas. O PHP permite iniciar uma escuta através da função socket_listen(), e você pode especificar um número (neste exemplo é o segundo. parâmetro: 3)
Código PHP:
<?
// 开始监听连接
$result = socket_listen ( $socket , 3 ) or die( "Could not set up socket listenern" );
?>
6. Até agora, seu servidor basicamente não fez nada, exceto esperar por uma solicitação de conexão do cliente. Depois que uma conexão do cliente é recebida, a função socket_assept() entra em ação. Ela recebe a solicitação de conexão e chama outro sub-. Socket lida com informações cliente-servidor.
Código PHP:
<?
//接受请求链接
// 调用子socket 处理信息
$spawn = socket_accept ( $socket ) or die( "Could not accept incoming connectionn" );
?>
Este subsocket agora pode ser usado para comunicação cliente-servidor subsequente.
7. Quando uma conexão for estabelecida, o servidor aguardará o envio de algumas informações de entrada pelo cliente. Essas informações podem ser obtidas pela função socket_read() e atribuídas à variável $input do PHP.
Código PHP:
<?
// 读取客户端输入
$input = socket_read ( $spawn , 1024 ) or die( "Could not read inputn" );
?>
O segundo parâmetro de socker_read é usado para especificar o número de bytes a serem lidos. Você pode usá-lo para limitar o tamanho dos dados obtidos do cliente.
Nota: A função socket_read continuará a ler os dados do cliente shell até encontrar os caracteres n, t ou . O script PHP considera esses caracteres como o final da entrada.
8. Agora o servidor deve processar os dados enviados pelo cliente (neste exemplo o processamento inclui apenas a entrada e retorno dos dados ao cliente). Esta parte pode ser completada pela função socket_write() (para que os dados sejam enviados). pelo soquete de comunicação É possível retornar um fluxo de dados ao cliente)
Código PHP:
<?
// 处理客户端输入并返回数据
$output = strrev ( $input ) . "n" ;
socket_write ( $spawn , $output , strlen ( $output )) or die( "Could not write outputn" );
?>
9. Assim que a saída for retornada ao cliente, o soquete pai/filho deve ser encerrado por meio da função socket_close()
Código PHP:
<?
// 关闭sockets
socket_close ( $spawn );
socket_close ( $socket );
?>