Commençons par un exemple simple : un service TCP qui reçoit une chaîne d'entrée, traite et renvoie cette chaîne au client. Voici le code correspondant :
Code 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 );
?>
Ce qui suit est une description détaillée de chaque étape :
1. La première étape consiste à créer deux variables pour enregistrer l'adresse IP et le port du serveur sur lequel le Socket est exécuté. Vous pouvez le définir sur votre propre serveur et votre propre port (ce port peut être un nombre compris entre 1 et 65535), à condition. que ce port Non utilisé.
Code PHP :
<?
// 设置两个变量
$host = "192.168.1.99" ;
$port = 1234 ;
?>
2. Vous pouvez utiliser la fonction set_time_out() côté serveur pour vous assurer que PHP n'expire pas en attendant la connexion du client.
Code PHP :
<?
// 超时时间
set_time_limit ( 0 );
?>
3. Sur la base des précédentes, il est temps de créer un Socket en utilisant la fonction socket_creat() --- cette fonction renvoie un handle de Socket, qui sera utilisé dans toutes les fonctions suivantes.
Code PHP :
<?
// 创建Socket
$socket = socket_create ( AF_INET , SOCK_STREAM , 0 ) or die( "Could not create socketn" );
?>
Le premier paramètre "AF_INET" permet de préciser le nom de domaine ;
Le deuxième paramètre "SOCK_STREM" indique à la fonction quel type de Socket sera créé (type TCP dans cet exemple)
Par conséquent, si vous souhaitez créer un Socket UDP, vous pouvez utiliser le code suivant :
Code PHP :
<?
// 创建socket
$socket = socket_create ( AF_INET , SOCK_DGRAM , 0 ) or die( "Could not create socketn" );
?>
4. Une fois qu'un handle Socket est créé, l'étape suivante consiste à le spécifier ou à le lier à l'adresse et au port spécifiés. Cela peut être fait via la fonction socket_bind().
Code PHP :
<?
// 绑定socket to 指定地址和端口
$result = socket_bind ( $socket , $host , $port ) or die( "Could not bind to socketn" );
?>
5. Une fois le Socket créé et lié à un port, vous pouvez commencer à écouter les connexions externes. PHP vous permet de démarrer une écoute via la fonction socket_listen(), et vous pouvez spécifier un nombre (dans cet exemple, c'est le deuxième). paramètre : 3)
Code PHP :
<?
// 开始监听连接
$result = socket_listen ( $socket , 3 ) or die( "Could not set up socket listenern" );
?>
6. Jusqu'à présent, votre serveur n'a pratiquement rien fait à part attendre une demande de connexion du client. Une fois la connexion client reçue, la fonction socket_assept() entre en jeu. Elle reçoit la demande de connexion et appelle un autre sous-. Socket gère les informations client-serveur.
Code PHP :
<?
//接受请求链接
// 调用子socket 处理信息
$spawn = socket_accept ( $socket ) or die( "Could not accept incoming connectionn" );
?>
Ce sous-socket peut désormais être utilisé pour une communication client-serveur ultérieure.
7. Lorsqu'une connexion est établie, le serveur attendra que le client envoie des informations d'entrée. Ces informations peuvent être obtenues par la fonction socket_read() et affectées à la variable $input de PHP.
Code PHP :
<?
// 读取客户端输入
$input = socket_read ( $spawn , 1024 ) or die( "Could not read inputn" );
?>
Le deuxième paramètre de socker_read est utilisé pour spécifier le nombre d'octets à lire. Vous pouvez l'utiliser pour limiter la taille des données obtenues du client.
Remarque : La fonction socket_read continuera à lire les données du client shell jusqu'à ce qu'elle rencontre les caractères n, t ou . Le script PHP considère ces caractères comme la fin de l'entrée.
8. Le serveur doit maintenant traiter les données envoyées par le client (dans cet exemple, le traitement inclut uniquement la saisie et le retour des données au client). Cette partie peut être complétée par la fonction socket_write() (afin que les données envoyées). par la socket de communication (il est possible de renvoyer un flux de données au client)
Code PHP :
<?
// 处理客户端输入并返回数据
$output = strrev ( $input ) . "n" ;
socket_write ( $spawn , $output , strlen ( $output )) or die( "Could not write outputn" );
?>
9. Une fois la sortie renvoyée au client, le socket parent/enfant doit être terminé via la fonction socket_close()
Code PHP :
<?
// 关闭sockets
socket_close ( $spawn );
socket_close ( $socket );
?>