服务端代码server.php

<?php
//创建socket套接字
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

/**
 * 第一个参数说明:
 *  AF_UNIX(本机通信)
 * AF_INET(TCP/IP – IPv4)
 * AF_INET6(TCP/IP – IPv6)
 * 第二个参数说明:
 *  SOCK_STREAM(TCP流)
 * SOCK_DGRAM(UDP数据报)
 * SOCK_RAW(原始套接字)
 * 第三个参数说明:
 * 如果第二个参数选择的是TCP,则传递SOL_TCP否则就SOL_UDP
 */

if (!$socket) {
    echo 'create socket error' . PHP_EOL;
} else {
    echo 'create socket success' . PHP_EOL;
}


/**
 * 因为一台主机可能存在多个 ip 地址,所以你需要指定你的 socket 监听的是哪一个,
 * 常用的值为 127.0.0.1,或者是监听所有地址 0.0.0.0,
 * 那么这里可能有人不明白了,127.0.0.1 和 0.0.0.0 有啥区别呢?
 * 127.0.0.1 只是一个回环地址,只能用于本机访问,说白了就是自己玩自己的,因为这个 ip 不对外部开放,所以别人也就无法访问这个地址,
 * 所以如果你的服务器地址设置为 127.0.0.1,别人想要访问,只能去屎吧。
 * 0.0.0.0 严格来说不算是一个 ip 地址,它的意思是本机的所有 IP 地址,都是我的,哈哈。
 */

//绑定ip和端口
$addr = '127.0.0.1';
$port = 8080;
if (socket_bind($socket, $addr, $port)) {
    echo 'bind addr success' . PHP_EOL;
} else {
    echo 'bind addr error' . PHP_EOL;
}

//监听套接字
if (!socket_listen($socket)) {
    echo 'listen socket error' . PHP_EOL;
} else {
    echo 'listen socket success' . PHP_EOL;
}

//接受客户端连接
$client = socket_accept($socket);

if (!$client) {
    echo 'socket_accept error' . PHP_EOL;
} else {

    echo 'socket_accept success' . PHP_EOL;

    //接受客户端返回内容
    while (true) {
        //第一个参数是客户端套接字   第二个参数从socket中获取的数据 第三个参数是设置长度最多为 len 字节的数据将被接收。
        $bytesNum = socket_recv($client, $buffer, 100, 0);

        if (!$bytesNum) {
            echo "socket_recv  failed" . PHP_EOL;
            exit(1);
        } else {
            echo "content from client:" . $buffer . PHP_EOL;
        }
    }
}

客户端代码client.php

<?php

//创建socket套接字
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

//连接套接字
if (!socket_connect($socket, '127.0.0.1', 8080)) {
    echo 'socket connect error' . PHP_EOL;
    exit(1);
} else {

    while (true) {

        //阻塞进程获取输入内容
        $data = fgets(STDIN);

        //如果用户输入quit,那么退出程序
        if (strcmp($data, "quit") == 0) {
            break;
        }

        //发送数据给服务端
        socket_write($socket, $data);
    }
}

这里先运行php server.php,然后运行php client.php,然后输入内容,服务端就能接受到了。

注:服务端代码接受信息用socket_recv的是socket_accept返回的客户端套接字而不是服务端套接字,刚开始运行总是报错,记录下

12-31 12:21