从PHP检测android java客户端连接超时

时间:2011-12-01 15:38:28

标签: java php android http

我正在使用使用java的Android设备连接到使用DefaultHttpClient运行PHP的服务器。

我正在做的一个测试是检查如果服务器在发送数据时花费很长时间,java代码会正常处理自己。如果确实需要很长时间,则会断开连接并重试。

目前我已通过以下方式将连接超时设置为3秒:

HttpConnectionParams.setSoTimeout(httpParameters, 3000);

在服务器上,PHP脚本正在休眠10秒钟:

sleep(10);

java代码有效,如果脚本花费的时间超过3秒,则会抛出java.net.SocketTimeoutException,然后在很短的时间后重试。

PHP脚本继续运行我想要的东西。我已经尝试在sleep函数之后直接使用connection_aborted进行测试,但是它没有捕获已经发生的客户端断开连接。

ignore_user_abort(true);
sleep(10);
print "black hole";
flush();
if(connection_aborted()!=0){
        // You would think this works but it does not.
}

推荐的方法是什么?

3 个答案:

答案 0 :(得分:2)

我实际上不久前写了一篇关于这个主题的文章,我会在这里给出一个简短的答案,并假设也可以发布一个相关的链接?

基本上,PHP只会弄清楚远程客户端在尝试使用连接到该远程套接字的套接字时已断开连接,直到您要求它对该套接字执行任何操作,它将假定一切正常。这是我用来检查远程断开连接的代码:

public function isAlive(){
        $res = @socket_recv($this->sockHandle, $data, 1024, MSG_PEEK);
        if($res === 0){
        return false;
        }else{
        return true;
        }
}

这里的重要部分是MSG_PEEK阻止清除所有待处理的消息,如果套接字没问题,“@”会导致错误,但没有消息待处理。

有关完整文章,请点击此处:

http://www.bracketbrotherhood.com/remote-disconnections-php-non-blocking-server-sockets/programming-and-development/

此致 菲尔,

答案 1 :(得分:0)

现在不确定它是否相同,但是很久以前我遇到了php而没有意识到连接中断,直到它实际上尝试写入或刷新其输出缓冲区。请参阅php的flush()和ob_flush();我不需要实际写任何东西来输出,只需刷新空缓冲就足以让它检查。

我认为php前面的webserver和其他东西可能会影响这种行为。

你可能需要调用ignore_user_abort(true);否则php可能会停止执行flush()调用(默认行为是在它意识到连接消失时停止),所以你的if语句永远不会被执行。

答案 2 :(得分:-1)

print
"black hole";
flush();
if(connection_aborted()!=0){
      // You would think this works but it does not.
   }

实际上,你不会认为这会起作用,因为它需要php脚本才能到达脚本中的那一点。如果你在最后编写它,那么脚本必须运行它。

我建议改为:

for($i=0;$i<10;$i++){
    echo ' '; ## echo "\0";  might also work
    flush();
    if(connection_aborted()!=0){
          // You would think this works but maybe it will now.
          die();
       }
     sleep(1); # the sleep should come after the check
}

试一试。很明显,你试图睡10秒然后杀死脚本......在所有情况下,该脚本将运行10秒钟。