课程咨询 :025-86971863

南京PHP培训 > 雇主企业 > 企业笔试题 > php socket 处理不过来数据流,该如何避免
  • php socket 处理不过来数据流,该如何避免

    发布:南京PHP培训      来源:企业笔试题    

  • php socket 处理不过来数据流,该如何处理(好像是阻塞了)

    需求:php接受一个硬件往8888端口上发送数据,如果收到后,应socket_send函数返回“\xFA\x01\x01\xFF\xAA\xAA\x00\x01\x00\x00\x00\x00\x00\x01”,硬件再接收到socket_send发送的数据后,会“滴”一声,但是问题出现了,一个硬件还好,但是当多个硬件同时连接并同时发送数据时,会出现硬件不能连续的回应(即发出“滴”的声音),也就是说能连续发出“滴”声后,便不在响了,大概几秒钟后,又开始响应了,过一会又不行了,几个连接上的硬件都是这样,我已经用了非阻塞模式,还是会这样,求解决方法,下面贴出代码

    <!--?php

    error_reporting(E_ALL);

    set_time_limit(0);

    ini_set("allow_call_time_pass_reference",true);

    //监听端口

    $PORT = 8888;

    //最大连接池

    $MAX_USERS = 50;

    //创建监听端口

    //$sock = socket_create_listen($PORT);

    $commonProtocol = getprotobyname("tcp");

    $sock = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);

    @socket_bind($sock, '192.168.1.112

    @socket_listen($sock);

    if (!$sock)

    {

    exit(1);

    }

    //不阻塞

    socket_set_nonblock($sock);

    $connections = array();

    $input = array();

    $close = array();

    while (true)

    {

    //sleep(3);

    $readfds = array_merge($connections, array($sock));

    $writefds = array();

    //选择一个连接,获取读、写连接通道

    if (socket_select($readfds, $writefds, $e = null, $t=60))

    {

    foreach ($readfds as $rfd)

    {

    //如果是当前服务端的监听连接

    if ($rfd == $sock)

    {

    //接受客户端连接

    $newconn = socket_accept($sock);

    $i = (int)$newconn;

    $reject = '';

    if (count($connections) -->= $MAX_USERS)

    {

    $reject = "Server full. Try again later.\n";

    }

    //将当前客户端连接放如socket_select选择

    $connections[$i] = $newconn;

    //输入的连接资源缓存容器

    $writefds[$i] = $newconn;

    //连接不正常

    if ($reject)

    {

    $close[$i] = true;

    }

    else

    {

    echo "Welcome to the PHP Chat Server!\n";

    }

    //初始化当前连接读取内容的缓存容器

    $input[$i] = "";

    continue;

    }

    //客户端连接

    $i = (int)$rfd;

    //读取

    $tmp = @socket_read($rfd, 14, PHP_NORMAL_READ);

    if (!$tmp)

    {

    //读取不到内容

    print "connection closed on socket $i\n";

    close($i);

    continue;

    }

    $input[$i] .= $tmp;

    $tmp = substr($input[$i], -1);

    /*if ($tmp != "\r" && $tmp != "\n")

    {

    // no end of line, more data coming

    continue;

    }*/

    $line = trim($input[$i]);

    $input[$i] = "";

    echo 'Client >>'.$line."\r\n";

    socket_getpeername($connections[$i],&$remoteIP,&$remotePort);

    echo $remoteIP."\r\n";

    echo $remotePort."\r\n";

    //$data=str_split($buffer);

    //print_r($data);

    $str="\xFA\x01\x01\xFF\xAA\xAA\x00\x01\x00\x00\x00\x00\x00\x01";

    socket_send($connections[$i],$str,strlen($str),0);

    }

    foreach ($writefds as $wfd)

    {

    $i = (int)$wfd;

    $w = socket_write($wfd, "hello");

    }

    }

    }

    function close($i)

    {

    global $connections, $input, $close;

    socket_shutdown($connections[$i]);

    socket_close($connections[$i]);

    unset($connections[$i]);

    unset($input[$i]);

    unset($close[$i]);

    }

    ?>

    南京php培训:nj.php.tedu.cn

    推荐文章

上一篇:用Thinphp发送电子邮件的方法

下一篇:PHP 常量与变量

最新开班日期  |  更多

PHP高级开发工程师就业班

PHP高级开发工程师就业班

开班日期:04-28

PHP高级开发工程师精品班

PHP高级开发工程师精品班

开班日期:04-28

PHP高级开发工程师周末班

PHP高级开发工程师周末班

开班日期:04-28

PHP高级开发工程师定制班

PHP高级开发工程师定制班

开班日期:04-28

  • 地址:南京市秦淮区太平南路333号金陵御景园8楼达内
  • 课程培训电话:025-86971863     全国服务监督电话:400-111-8989
  • 服务邮箱 tousu@tedu.cn
  • 2002-2018 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56