Home  >  Article  >  Backend Development  >  PHP socket programming

PHP socket programming

高洛峰
高洛峰Original
2016-11-19 10:31:35832browse

  PHP socket programming is relatively difficult to understand. However, as long as we understand the relationship between several socket functions and the roles they play, it should not be difficult to understand. In the author’s opinion, socket programming , in fact, it is to establish a client and server of a network service, which is the same as the client and server of mysql. As long as you understand what the client and server of mysql are, you should be able to understand the following. Something to talk about.

  Regarding the network protocols involved in socket programming, such as TCP, UDP, socket three-way handshake, etc., there are very detailed explanations of these network protocols on the Internet. I will not go into them here. I will only take a screenshot of the process of establishing a socket. Let you take a look:

PHP socket programming

  This picture was stolen from others through hard work. You must take a good look at it. At the same time, I also express my gratitude to the author whose screenshot was stolen from me. I am very grateful to the author. I apologize for stealing your pattern, and I hope you don't care about it. I am too lazy to draw pictures (actually it means I am not confident in my drawing skills, haha).

   How does the socket establish a connection? As mentioned above, the process of establishing a connection is essentially the same as the connection between mysql client and server. The difference between it and mysql is that the server and client of mysql have been edited for us, we just need to apply it. However, the critical moment has come. Socket does not provide us with anything. The only thing it provides us is: dozens of socket functions.

 The implication is that socket programming requires us to create the server and client ourselves. In other words, ``socket programming``--it requires us to build a server and client application similar to mysql.

  Having said that, I want to ask, do you think this socket gives people a headache? It neither creates a server nor a client for us to apply. We have to use the socket function ourselves and create our own network protocol socket application. Doesn't this give you a headache? There is no solution to the headache. If you need your own application, you still have to deal with sockets. Haha, this is just a digression, I won’t say much more, let’s get to the point.

   Before you are confused by socket programming, I will let you take a look at several key functions of socket and explain their respective functions to you first. Otherwise, if someone who has no foundation in socket programming reads this, I'm afraid that after reading it, you will decisively skip this article and develop a phobia about sockets from now on. Haha, say more.

  Key function 1 of socket:

  socket_create($net parameter 1, $stream parameter 2, $protocol parameter 3)

   Function: Create a socket socket. To put it bluntly, it is a network data stream.

  Return value: a socket, or false, an E_WARNING warning will be issued if the parameter is incorrect

  The PHP online manual makes it more clear:

  socket_create creates and returns a socket, also called a communication node. A typical network connection consists of 2 sockets, one running on the client side and the other running on the server side.

The above sentence is copied from the php online manual. Do you see that the meaning here is exactly the same as the client and server that I mentioned repeatedly above? hehe.

  Parameter 1 is: network protocol,

  What are the network protocols? Its options are the following three: AF_INET: IPv4 network protocol. Both TCP and UDP can use this protocol. This is generally used, you know.

 AF_INET6: IPv6 network protocol. Both TCP and UDP can use this protocol.

  AF_UNIX: Local communication protocol. High-performance and low-cost IPC (Inter-Process Communication).

  Parameter 2: Socket stream, options are:

  SOCK_STREAM  SOCK_DGRAM  SOCK_SEQPACKET  SOCK_RAW  SOCK_RDM.

  Only the first two are explained here:

  SOCK_STREAM TCP protocol socket.

  SOCK_DGRAM  UDP protocol socket.

  For more information, please link here: http://php.net/manual/zh/function.socket-create.php

  Parameter 3: protocol protocol, options are:

  SOL_TCP:  TCP protocol.

  SOL_UDP: UDP protocol.

  It can be seen from here that the second parameter and the third parameter of the socket_create function are actually related.

   For example, if your first parameter uses the IPv4 protocol: AF_INET, and then the second parameter uses the TCP socket: SOCK_STREAM,

  then the third parameter must use SOL_TCP, which should not be difficult to understand.

  As for TCP protocol sockets, of course you can only use TCP protocol, right? If you use UDP sockets, I won’t say how to choose the third parameter, haha, you know.

  Key function 2:

  socket_connect($socket parameter 1, $ip parameter 2, $port parameter 3)

   Function: connect a socket, the return value is true or false

   Parameter 1: socket_create Function return value

                                                 �         since in in in in initu A socket, the return value is true or false

   Parameter 1: function return value of socket_create

  Parameter 2: IP address

  Parameter 3: Port number

Key function 4:

   socket_listen($sock et parameters 1,$backlog Parameter 2)

Function: Listen to a socket, the return value is true or false

  Parameter 1: The function return value of socket_create

  Parameter 2: The maximum number of listening sockets

  Key Function 5:

   socket_accept($socket)

                ‖                                                                 me in in in in injun in>>                                           me in in in in in>> :

   socket_read($socket)

    Function: Read the resource information of the socket,

   Return value: Successfully convert the socket resource into string information, failure is false

    Parameters: socket_create or socket_accept Function return value

  Key function 7:

  socket_write($socket parameter 1, $msg parameter 2, $strlen parameter 3)

   Function: Write data into the socket

   Return value: Successfully return character The byte length of the string, failure is false

   Parameters: function return value of socket_create or socket_accept

    Key function 8:

   socket_close($socket)

   Function: Close the socket

   Return Value: returned successfully true, failure is false

   Parameters: function return value of socket_create or socket_accept

   These eight functions are the core functions of socket. Here are two more important functions

   socket_last_error($socket), the parameter is socket_create The return value is to get the last error code number of the socket. The return value is socket code

  socket_strerror($code). The parameter is the return value of the socket_last_error function. Get the string information of the code. The return value is Socket error message

  These two functions are still very important in socket programming. When writing socket programming, I think you still have to make use of them, especially for novices. They can be used for debugging

  

  The following is Code, pay attention, please read my comments carefully, comments are very important, comments are very important, comments are very important, important things should be shouted three times, haha.

  Server-side script, D:vhosttestsocketserver_socket.php 

<?php
//创建服务端的socket套接流,net协议为IPv4,protocol协议为TCP
$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);

    /*绑定接收的套接流主机和端口,与客户端相对应*/
    if(socket_bind($socket,&#39;127.0.0.1&#39;,8888) == false){
        echo &#39;server bind fail:&#39;.socket_strerror(socket_last_error());
        /*这里的127.0.0.1是在本地主机测试,你如果有多台电脑,可以写IP地址*/
    }
    //监听套接流
    if(socket_listen($socket,4)==false){
        echo &#39;server listen fail:&#39;.socket_strerror(socket_last_error());
    }
//让服务器无限获取客户端传过来的信息
do{
    /*接收客户端传过来的信息*/
    $accept_resource = socket_accept($socket);
    /*socket_accept的作用就是接受socket_bind()所绑定的主机发过来的套接流*/

    if($accept_resource !== false){
        /*读取客户端传过来的资源,并转化为字符串*/
        $string = socket_read($accept_resource,1024);
        /*socket_read的作用就是读出socket_accept()的资源并把它转化为字符串*/

        echo &#39;server receive is :&#39;.$string.PHP_EOL;//PHP_EOL为php的换行预定义常量
        if($string != false){
            $return_client = &#39;server receive is : &#39;.$string.PHP_EOL;
            /*向socket_accept的套接流写入信息,也就是回馈信息给socket_bind()所绑定的主机客户端*/
            socket_write($accept_resource,$return_client,strlen($return_client));
            /*socket_write的作用是向socket_create的套接流写入信息,或者向socket_accept的套接流写入信息*/
        }else{
            echo &#39;socket_read is fail&#39;;
        }
    /*socket_close的作用是关闭socket_create()或者socket_accept()所建立的套接流*/
        socket_close($accept_resource);
    }
}while(true);
socket_close($socket);

    Client-side script, D:vhosttestsocketclient_socket.php

<?php
    //创建一个socket套接流
    $socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
    /****************设置socket连接选项,这两个步骤你可以省略*************/
     //接收套接流的最大超时时间1秒,后面是微秒单位超时时间,设置为零,表示不管它
    socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec" => 1, "usec" => 0));
     //发送套接流的最大超时时间为6秒
    socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array("sec" => 6, "usec" => 0));
    /****************设置socket连接选项,这两个步骤你可以省略*************/

    //连接服务端的套接流,这一步就是使客户端与服务器端的套接流建立联系
    if(socket_connect($socket,&#39;127.0.0.1&#39;,8888) == false){
        echo &#39;connect fail massege:&#39;.socket_strerror(socket_last_error());
    }else{
        $message = &#39;l love you 我爱你 socket&#39;;
        //转为GBK编码,处理乱码问题,这要看你的编码情况而定,每个人的编码都不同
        $message = mb_convert_encoding($message,&#39;GBK&#39;,&#39;UTF-8&#39;);
        //向服务端写入字符串信息

        if(socket_write($socket,$message,strlen($message)) == false){
            echo &#39;fail to write&#39;.socket_strerror(socket_last_error());

        }else{
            echo &#39;client write success&#39;.PHP_EOL;
            //读取服务端返回来的套接流信息
            while($callback = socket_read($socket,1024)){
                echo &#39;server return message is:&#39;.PHP_EOL.$callback;
            }
        }
    }
    socket_close($socket);//工作完毕,关闭套接流

  How to test these two scripts?

   First open the Windows DOS window, which is the cmd black window, and then run php D:vhosttestsocketserver_socket.php,

  Let the server-side black window continue to run,

  Secondly, the PHP client script can be run through the browser , you can also open another cmd black window to run

  php D:vhosttestsocketclient_socket.php

  Please note here: the php running name must be added to the Windows environment variable. If you don’t know how to add it,

  Please enter the php running command Run the directory with an absolute command, or you can add the php command to the environment variable in Baidu

 This is my situation, your file address may be different from mine, please operate according to your address, otherwise, you will be responsible for the consequences, haha

  As mentioned above, socket programming requires a server to communicate, so the black window on the server must be kept open.

Postscript:

socket_set_option ($socket parameter 1, $level parameter 2, $optname parameter 3, $optval parameter 4)

The function of this function is to set the data flow option for the socket, which is still a very important function.

Parameter 1: function return value of socket_create or socket_accept

Parameter 2: SOL_SOCKET, it seems that only this option

Parameter 3 is related to parameter 4,

Parameter 3 can be: SO_REUSEADDR SO_RCVTIMEO S0_SNDTIMEO

Explain it :

SO_REUSEADDR It is to allow the socket port to be used again immediately after it is released

   If parameter 3 is this, then parameter 4 can be true or false

SO_RCVTIMEO It is the maximum timeout time of the socket's receiving resource

SO_SNDTIMEO  Yes The maximum timeout of the socket's sending resource

If parameter 3 is these two, then parameter 4 is an array array like this ('sec'=>1,'usec'=>500000)

They all set the maximum timeout time. However, one is in seconds and the other is in microseconds. They have the same effect


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Previous article:PHP learning requirementsNext article:PHP learning requirements