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

  • 相关阅读:
    hdu 4027 Can you answer these queries?
    hdu 4041 Eliminate Witches!
    hdu 4036 Rolling Hongshu
    pku 2828 Buy Tickets
    hdu 4016 Magic Bitwise And Operation
    pku2886 Who Gets the Most Candies?(线段树+反素数打表)
    hdu 4039 The Social Network
    hdu 4023 Game
    苹果官方指南:Cocoa框架(2)(非原创)
    cocos2d 中 CCNode and CCAction
  • 原文地址:https://www.cnblogs.com/tudou1223/p/11881997.html
Copyright © 2011-2022 走看看