zoukankan      html  css  js  c++  java
  • 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 = '您已经成功申请该圈子!请等待圈主审核!' . " ";
        $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         = '发送一个请求!' . "
    ";
        $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。)

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

  • 相关阅读:
    javascript 创建字典
    IE显示PNG
    透明PNG背景图片 For IE 6.0 Firefox Opera
    IE FireFox对CSS的不同解释收集
    javascript中replace()
    netstat 指令返回结果中state含义
    FIREFOX层的自适应高度
    select options的操作
    事件冒泡
    C++第三讲笔记
  • 原文地址:https://www.cnblogs.com/lxdd/p/3891048.html
Copyright © 2011-2022 走看看