Let's start with a simple example - a TCP service that receives an input string, processes and returns this string to the client. Here is the corresponding code:
PHP code:
<?
// 设置一些基本的变量
$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 );
?>
The following is a detailed description of each step:
1. The first step is to create two variables to save the IP address and port of the server where the Socket is running. You can set it to your own server and port (this port can be a number between 1 and 65535), provided that this port Not used.
PHP code:
<?
// 设置两个变量
$host = "192.168.1.99" ;
$port = 1234 ;
?>
2. You can use the set_time_out() function on the server side to ensure that PHP does not time out while waiting for the client to connect.
PHP code:
<?
// 超时时间
set_time_limit ( 0 );
?>
3. Based on the previous ones, it is time to create a Socket using the socket_creat() function---this function returns a Socket handle, which will be used in all subsequent functions.
PHP code:
<?
// 创建Socket
$socket = socket_create ( AF_INET , SOCK_STREAM , 0 ) or die( "Could not create socketn" );
?>
The first parameter "AF_INET" is used to specify the domain name;
The second parameter "SOCK_STREM" tells the function what type of Socket will be created (TCP type in this example)
Therefore, if you want to create a UDP Socket, you can use the following code:
PHP code:
<?
// 创建socket
$socket = socket_create ( AF_INET , SOCK_DGRAM , 0 ) or die( "Could not create socketn" );
?>
4. Once a Socket handle is created, the next step is to specify or bind it to the specified address and port. This can be done through the socket_bind() function.
PHP code:
<?
// 绑定socket to 指定地址和端口
$result = socket_bind ( $socket , $host , $port ) or die( "Could not bind to socketn" );
?>
5. After the Socket is created and bound to a port, you can start listening for external connections. PHP allows you to start a listening through the socket_listen() function, and you can specify a number (in this example It’s the second parameter: 3)
PHP code:
<?
// 开始监听连接
$result = socket_listen ( $socket , 3 ) or die( "Could not set up socket listenern" );
?>
6. Up to now, your server has basically done nothing except waiting for a connection request from the client. Once a client connection is received, the socket_assept() function comes into play. It receives the connection request and calls Another sub-Socket handles client-server information.
PHP code:
<?
//接受请求链接
// 调用子socket 处理信息
$spawn = socket_accept ( $socket ) or die( "Could not accept incoming connectionn" );
?>
This subsocket can now be used for subsequent client-server communication.
7. When a connection is established, the server will wait for the client to send some input information. This information can be obtained by the socket_read() function and assigned to the $input variable of PHP.
PHP code:
<?
// 读取客户端输入
$input = socket_read ( $spawn , 1024 ) or die( "Could not read inputn" );
?>
The second parameter of socker_read is used to specify the number of bytes to be read. You can use it to limit the size of data obtained from the client.
Note: The socket_read function will continue to read the shell client data until it encounters the n, t or characters. The PHP script regards these characters as the end of the input.
8. Now the server must process the data sent by the client (in this example, the processing only includes the input and return of data to the client). This part can be completed by the socket_write() function (so that the data sent by the communication socket It is possible to return a data stream to the client)
PHP code:
<?
// 处理客户端输入并返回数据
$output = strrev ( $input ) . "n" ;
socket_write ( $spawn , $output , strlen ( $output )) or die( "Could not write outputn" );
?>
9. Once the output is returned to the client, the parent/child socket should be terminated through the socket_close() function
PHP code:
<?
// 关闭sockets
socket_close ( $spawn );
socket_close ( $socket );
?>