2012-06-29 42 views
0

我想实现一个聊天应用程序,其中php将充当服务器,而android将充当客户端。Socket编程PHP脚本不断加载

问题是,PHP脚本不断加载,并不停止。当我介绍一个循环来监听和输出从我的android模拟器连续发送的消息。但是当我删除循环它一直加载,并尽快我从我的android模拟器发送消息,它输出一次,脚本stops.Now我不知道如何完成这一点(即每当我发送消息从android它呼应在页面上他们,并继续这样做,直到我发送出口消息退出脚本)。

这里是我的PHP脚本:

set_time_limit (0); 

$address = '10.116.27.107'; 
$port = 1234; 

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

socket_listen($sock); 
while(1) 
{ 
    $client = socket_accept($sock); 
    $input = socket_read($client, 1024); 

    $output = preg_replace("[ \t\n\r]","",$input).chr(0); 
    socket_write($client, $output); 

     if($input=="exit") 
    break; 

echo $input; 

socket_close($client); 

} 
socket_close($sock); 
+0

你是什么意思“不停止加载”?你想在浏览器中打开它吗?实际上,服务器部分*意味着*永不停止加载,直到它被迫退出。 – Lyth

回答

1

为了实现你要提高你的代码,以便它可以处理多个连接,这不仅仅是复杂颇有几分聊天应用读写一位客户。从我的经验来看,这是一个从单一用户系统到多用户系统的巨大飞跃,这就是为什么学习如何通过反复试验来编写聊天系统需要时间的原因。

不过我相信做上面会帮助你避免你的问题,我猜是最可能是由于所谓阻塞 - 该系统正在等待输入/输出继续之前并没有得到任何。

基本上有几件事情你需要采取在考虑到与聊天应用:

  1. 你需要运行从PHP命令行聊天脚本,在浏览器中运行将为您呈现更多与超时有关的复杂问题以及浏览器期望网页如何工作的问题。如果你使用的是Mac OSX,你可以使用终端,如果你知道linux,你可以明显地使用linux,如果你在Windows上...... get puTTY并连接到一个linux服务器,我相信你可以在Windows上运行php命令行,它不是我曾经尝试过的(或者希望)。

  2. 你需要使用socket_select()在用户评论http://uk.php.net/socket_select中有一些简单的例子说明如何使用它。

  3. 你总是需要知道客户端处于什么状态 - 即只读时,你可以读,只写时,你可以写......通常,如果你能读或写,那么你必须所以为了让事情继续顺利进行(而不是结束冻结) - 聊天应用程序非常棘手,正是出于这个原因。

  4. 客户端可能会突然断开连接,因此您需要在读取和写入过程中处理此问题。

  5. 无论何时读写 - 尤其是使用php - 读写功能可能无法一次发送或接收所有信息。与fwrite()fread()类似,您应该检查已写入的内容(如果未完成,请继续写入)并继续读取,直到没有其他内容要读取为止。

  6. 根据客户的不同,某些系统希望消息以特定终止字符结束/终止 - 即\ n或\ 0。大多数聊天应用程序要么检测使用哪种应用程序,要么发送这两种应用程序作为每个谨慎消息的一部分