zoukankan      html  css  js  c++  java
  • 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返回的客户端套接字而不是服务端套接字,刚开始运行总是报错,记录下

  • 相关阅读:
    redis 内存管理与数据淘汰机制(转载)
    Memcached特性及优缺点
    二叉树深度优先遍历和广度优先遍历
    电商 秒杀系统 设计思路和实现方法(转载)
    6种负载均衡算法
    解决like '%字符串%'时索引不被使用的方法
    哪些情况下索引会失效?
    PreferenceActivity详解
    sun.misc.BASE64Encoder在Eclipse中不能直接使用的原因和解决方案
    单点登录原理与简单实现
  • 原文地址:https://www.cnblogs.com/tudou1223/p/11881997.html
Copyright © 2011-2022 走看看