PHP socket 简单使用示例(Windows)

  1. 只能在cli模式下运行,在浏览器中运行没有结果。
  2. 客户端socket程序示例(使用了cli 模式下的用户输入输出STDIN和STDOUT)
    <?php 
    
    $protocol = getprotobyname('tcp');
    $socket = socket_create(AF_INET, SOCK_STREAM, $protocol);
    
    if ($socket === false) {
        echo socket_last_error();
    } else {
        echo "
    socket created is ok.
    ";
    }
    
    $conn = socket_connect($socket, '127.0.0.1', 1324);
    
    $buffer = "
    hello, i am a client.
    ";
    socket_write($socket, $buffer, strlen($buffer));
    
    
    do{
        $read = socket_read($socket, 1024);
        if ($read === false) {
            echo '没有服务器器数据返回';
            break;
        } else {
            echo "server data is :
    ";
            echo $read, "
    ";
        }
        
        // 向命令行写入数据
        fwrite(STDOUT,"
    This is client console. Please input a argument:
    ");
        
        
        // 获取命令行手动输入的参数发送给服务器
        $arg = trim(fgets(STDIN));
        socket_write($socket, $arg, strlen($arg));
    
    } while (true);
    
    
    socket_close($socket);
    
    
    
    // cli mode 用户输入输出数据测试
    // for ($i = 0; $i <= 5; $i++) {
    //     fwrite(STDOUT,"Please input a argument:");
    //     $arg = trim(fgets(STDIN));
    //     echo $arg."
    ";
    // }
    View Code
  3. 服务端socket程序(经测试:socket_read()和socket_write(),函数第一个参数使用socket_create返回的资源$socket 不行。,socket_read()接收不到数据socket_write()也不能发送数据,必须使用socket_accept函数返回的资源$accept 才能正常获取到传输的数据)
    <?php 
    
    $protocol = getprotobyname('tcp');  //获取integer
    $socket = socket_create(AF_INET, SOCK_STREAM, $protocol);
    
    if ($socket === false) {
        echo socket_last_error();
    } else {
        echo "create socket is ok. use tcp protocol.
    ";
    }
    
    $bind = socket_bind($socket, '127.0.0.1', 1324);
    
    if ($bind === false) {
        echo socket_last_error();
    } else {
        echo "bind address and port successfully.
    ";
    }
    
    $listen = socket_listen($socket);
    
    if ($listen === false) {
        echo socket_last_error();
    } else {
        echo "service is listening...
    ";
    }
    
    // socket_set_nonblock($socket);
    
    do{
        $accept = socket_accept($socket);
        if (!$accept) {
            echo socket_last_error();
        } else {
            // print_r($accept);
            $read = socket_read($accept, 1024);       // 经测试:socket_read(),函数第一个参数使用socket_create返回的资源$socket 不行。,读取不到数据,必须使用socket_accept函数返回的资源$accept 才能正常获取到传输的数据
    
            if ($read === false) {
                echo socket_last_error();
            } else {
                echo $read;
                $buffer = "
    hello  i am a server.
    ";
                socket_write($accept, $buffer, strlen($buffer));
    
                // 和客户端交互, 根据客户端输入参数返回不同的数据
                while (true) {
                    $res = socket_read($accept, 1024);
                    if ($res === false) {
                        break;
                    }
    
    
                    echo "
    client sended : 
    ", $res;
                    
                    switch (substr($res, 0, 1)) {
                        case 'a':
                            $send_data = 'aaaaaaaaaa';
                            break;
                        case 'b':
                            $send_data = 'bbbbbbbbbb';
                            break;
                        case 'c':
                            $send_data = 'cccccccccc';
                            break;
                        default:
                            $send_data = 'dddddddddd';
                            break;
                    }
                    socket_write($accept, $send_data, strlen($send_data));
                }
            }
        }
        // socket_close($socket);
    } while (true);
    
    socket_close($socket);
    View Code
  4. socket_shutdown() 关闭数据接收  或 数据发送 或 都关闭,0 :shutdown socket read。 1:shutdown socket  write 。 2:shutdown  socket read and write
原文地址:https://www.cnblogs.com/bneglect/p/13518729.html