• php socket编程入门例子


    服务端代码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 (trim($data) == 'quit') {
                socket_close($socket);
                break;
            }
    
            //发送数据给服务端
            socket_write($socket, $data);
        }
    }

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

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

  • 相关阅读:
    Linux 进程学习(四) sigaction 函数
    Netty 编解码奥秘
    我的博客即将同步至 OSCHINA 社区,这是我的 OSCHINA ID:护国小将,邀请大家一同入驻:https://www.oschina.net/sharingplan/apply
    Netty数据如何在 pipeline 中流动
    PLM系统安装四:主卷服务安装(FSC缓存服务器plm4IP:42.20)
    Linux系统信息和进程相关命令(CPU,内存,进程)
    SAN交换机配置的备份还原,固件升级
    san交换机的级联
    PLM系统安装五(2):Corporate服务安装plm1IP:42.106
    第三步:服务器虚拟化XenServer实施部署文档
  • 原文地址:https://www.cnblogs.com/tudou1223/p/11881997.html
Copyright © 2020-2023  润新知