socket 初步使用

   socket分为2个部分,1部分是服务器端,监听某个接口,当有客户端有请求时,自动运行代码。

第二个部分是客户端,来传送数据。

<?php
    //服务器端口
header('Content-type:text/html;Charset=GBK');
    //服务器段程序,监听借口,并进行相应的数据处理

    /*
        socket 服务器通信整个过程
        socket_creat
        socket_bind
        socket_listen
        socket_accetp
        socket_read
        socket_write
        socket_close
    */

    //1,创建通信节点
    $socket             = socket_create(AF_INET,SOCK_STREAM,0);
    if(!$socket)
        exit('create error : ' . socket_strerror(socket_last_error()));

    //2,绑定制定端口
    $ip                 = '127.0.0.1';
    $port                 = '1935';
    $res                 = socket_bind($socket,$ip,$port);
    if(!$res)
        exit('bind error:' . socket_strerror(socket_last_error()));

    //3, 开始监听
    $res                 = socket_listen($socket);
    if(!$res)
        exit('listen error ' . socket_strerror(socket_last_error()));

    //4,接收一个通信,处理
    do {

        $msgsock         = socket_accept($socket);
        if(!$msgsock)
            exit('accetp error:' . socket_strerror(socket_last_error()));

        //读出客户端传入的数据
        $msgclient         = socket_read($msgsock, 1024);
        if($msgclient === false)
            exit('read error:' . socket_strerror(socket_last_error()));

        echo '收到客户端数据:' . $msgclient;
        //返回信息
        $remsg             = '已经收到请求!处理完毕!123';
        $res             = socket_write($msgsock, $remsg);
        if($res === false)
            exit('write error :' . socket_strerror(socket_last_error()));
        //相关操作
        echo '正在进行操作...';
    /*
      8.5追加,利用pcntl_fork()来产生2个进程,父进程直接给客户端返回消息,子进程对消息进行处理,很简陋,有待优化跟逻辑判断

//如果接收到了客户端消息,
//此处分进程
if($msgclient !== false) {
  require_once('conn.php');
  $pid = pcntl_fork();


  if($pid) {
    //父
    $remsg = '您已经成功申请该圈子!请等待圈主审核!' . "\n";
    $res = socket_write($msgsock, $remsg);
    if($res === false)
    exit('write error :' . socket_strerror(socket_last_error()));
  }else {
    //子
    sleep(100);

    //继续处理
  }
}


    */
sleep(10); //释放资源 socket_close($msgsock); }while(true); //5,释放资源 socket_close($socket);
//触发端口,让服务器程序运行,端口设置为 1935
    //初始化
    $ip             = '127.0.0.1';
    $port             = '1935';
    /*
        socket链接整个过程
        1,socket_create
        第一个参数指定应用程序使用的通信协议的协议族,对于TCP/IP协议族,该参数置AF_INET;
        第二个参数指定要创建的套接字类型,流套接字类型为SOCK_STREAM、数据报套接字类型为SOCK_DGRAM、原始套接字SOCK_RAW(WinSock接口并不适用某种特定的协议去封装它,而是由程序自行处理数据包以及协议首部);
        第三个参数指定应用程序所使用的通信协议。此参数可以指定单个协议系列中的不同传输协议。在Internet通讯域中,此参数一般取值为0,系统会根据套接字的类型决定应使用的传输层协议。
        2,socket_connect
        3,socket_write
        4,socket_read
        5,socket_close
    */
    //1,创建通信节点
    $socket         = socket_create(AF_INET,SOCK_STREAM,0);
    if($socket === false)
        exit('创建节点失败!错误信息:' . socket_strerror(socket_last_error()));
    echo '创建节点成功,准备链接...','<br />';

    //2,开始链接
    $res             = socket_connect($socket,$ip,$port);
    if (!$res) {
        exit('连接节点失败!失败原因:' . socket_strerror(socket_last_error()));
    }
    echo '链接成功!准备发送....','<br />';

    //3,发送数据
    $buffer         = '发送一个请求!' . "\r\n";
    $res             = socket_write($socket, $buffer);
    if($res === false)
        exit('发送请求失败!失败原因:' . socket_strerror(socket_last_error()));

    //4,接受服务器回传信息
    $out             = socket_read($socket, 8192);
    if ($out === false) {
        exit('获取服务器回传内容失败!原因:' . socket_strerror(socket_last_error()));
    }
    if ($out)
        echo '获取到服务器回传内容--><strong style="color:red">' . $out . '</strong>';
    else 
        echo '服务器没有回传内容!';

    //关闭链接
    socket_close($socket);

运行后发现缺点,就是还是单进程的。

当服务器运行速度很慢时候,会造成客户端长时间的等待。不利于用户体验。

目前自己的想法是就要利用php实现多进程来配合使用,多进程的实现为一般有两种方法,一种是使用PHP自带的pcntl_*函数(仅限linux),另一种就是使用popen/proc_open,然后在php内部控制进程数量。

明天进行研究。(linux下使用fork。)

目前只是简单的了解并且使用。

posted @ 2014-08-04 21:39  栋的博客  阅读(269)  评论(0编辑  收藏  举报
深入理解php php扩展开发 docker mongodb