2013-02-20 163 views
0

我想在php中编写异步套接字侦听器代码。但听众响应只回答第一个请求和其他请求它只能接收数据包没有响应(我正在检查与嗅探器)我还在计算有多少时间循环活动和循环活动只为第一个请求.... ..我会告诉我的代码:异步套接字连接在php

addr = '192.168.0.117'; 
$port = 7878; 
$sock = socket_create(AF_INET, SOCK_STREAM, 0); 
socket_bind($sock, $addr, $port) or die('Could not bind to address'); 
socket_listen($sock); 

$null = NULL; 
$clients = Array(); 
$cc = 0; // loop counter 

while(true){ 

    echo $cc."<br>"; 
    $cc = $cc +1; 

    $read[0] = $sock; 

    $ready = socket_select($read,$null,$null,$null);  
    $client = socket_accept($sock); 
    $input = socket_read($client, 312); 


    echo $input; 

    if($input == "exit"){ 
     socket_close($client); 
     socket_close($sock); 
     return false; 
    } 

    $output = 0x11; 
    socket_write($client,$output); 
    $input = ""; 
} 
+0

供参考:这不是异步 – 2013-02-20 12:11:27

+0

感谢科林的信息,但你能帮我吗? – user1360571 2013-02-20 12:12:55

回答

0

可能是你正在关闭监听套接字的第一客户端发送exit命令之后。当客户端发送exit命令时,您应该只关闭client套接字。并且您从while循环中您return false。这意味着它显然只会处理一个客户端。

if($input == "exit"){ 
    socket_close($client); 
    socket_close($sock); // Think about this Line. 
    return false; // Think about this Line. 
} 
+0

谢谢你的回答shazin,这个命令退出是为所有的客户端是正确的......这里没有问题......问题出现在首先请求例如“3401000031313639313030303938383334380051”服务器接收它并打印到屏幕中的循环...但1个数据包后,只有嗅探器可以看到数据包在同一个本地端口接收,但我的服务器无法显示到屏幕上,并且循环计数器再次为0.当我从另一个服务器发送请求“退出”时,它可以收回它并且循环数为1。它只为新的连接循环,但我需要循环每个新的异步数据包... PS对不起英语 – user1360571 2013-02-20 12:11:36

+0

@ user1360571如果你想要真正的异步通信,你需要选择一种新的语言。就目前而言,这是同步和阻塞。你的'socket_read'将会挂起,直到它接收到312个字节的数据,或者连接关闭(以先到者为准)。在PHP手册中查找'stream_set_blocking',但明白它不能解决你所有的问题。 PHP并不打算像这样异步。考虑为这个项目使用类似node.js的东西,如果这些是你的要求的话。 – 2013-02-20 12:14:19