2011-12-01 116 views
5

我从使用java的android设备连接到使用DefaultHttpClient运行PHP的服务器。检测来自PHP的android java客户端连接超时

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

目前我有设置在连接超时时间为3秒:

HttpConnectionParams.setSoTimeout(httpParameters, 3000); 

在PHP脚本处于睡眠状态,持续10秒服务器:

sleep(10); 

Java代码的工作,如果脚本需要3秒以上的时间,然后抛出一个java.net.SocketTimeoutException,然后在少量时间后重试。

PHP脚本继续运行,它是而不是我想要的。我试过在睡眠函数后直接使用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. 
} 

建议如何处理?

+0

什么相关的PHP代码是什么样子? – Phil

+0

@在一条简单的线上睡10秒。 – zaf

+0

@Phil我已经用connection_aborted添加了我的尝试 – zaf

回答

0

不知道现在是否一样,但很久以前我碰到php没有意识到连接被中止,直到它实际上试图写入或刷新其输出缓冲区。看到PHP的flush()和ob_flush();我不需要真正写任何输出,只需清空空缓冲区就足以让它检查。

我会想象web服务器和其他东西在php前面可能会影响这种行为。

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

+0

是的,它似乎指出了简单的睡眠脚本没有输出任何内容的事实。让我们看看在connection_abort函数触发之前是否调用flush。 – zaf

+0

我的尝试失败。用更新后的代码查看我的问题。 – zaf

-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秒。

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/

问候, 菲尔,

+0

不错的文章阅读和谢谢你的答案。我已经推出了代码,因此可能需要一些时间来全面测试您的想法。 – zaf