我想实现一个聊天应用程序,其中php将充当服务器,而android将充当客户端。
问题是php脚本继续加载并且不会停止。当我引入一个循环来监听并输出从我的android模拟器连续发送的消息时。但是当我删除循环它继续加载并且我一直在从我的Android模拟器发送消息,它输出一次,脚本停止。现在我不知道如何实现这一点(即每当我从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 :(得分:1)
为了实现聊天应用程序,您必须改进代码,以便它可以处理多个连接,这比仅仅读取和写入一个客户端要复杂得多。根据我的经验,这是从单一用户系统到多用户的巨大飞跃,这就是为什么学习如何通过反复试验来编写聊天系统的原因。
但是我相信做上述操作可以帮助您避免出现问题,我猜这很可能是因为所谓的阻塞 - 系统在继续之前等待输入/输出没有得到任何。
基本上,您需要为聊天应用程序考虑一些事项:
您需要从php命令行运行聊天脚本,在浏览器中运行会向您提供有关超时的更复杂问题以及浏览器期望网页如何工作的问题。如果你使用Mac OSX你可以使用终端,如果你知道linux你显然可以使用linux,如果你在Windows上...获取puTTY并连接到linux服务器,我相信你可以在Windows上运行php命令行,这不是我曾尝试过的事情(或希望)。
您需要使用socket_select()
这里有一些简单的示例,说明如何在用户评论http://uk.php.net/socket_select中使用此功能。
您始终需要了解客户所处的状态 - 即只有在您可以阅读时才阅读,只有在您可以写作时才会写... ...通常,如果您可以阅读或写作,那么必须这样做才能使事情顺利进行(而不是最终结束) - 正是因为这个原因,聊天应用程序非常棘手。
客户端可能会突然断开连接,因此您需要在读写过程中处理此问题。
每当读写时 - 特别是使用php - 读写功能可能无法一次性发送或接收所有信息。与fwrite()
和fread()
类似,您应该检查已写入多少(如果未完成则继续写入)并继续阅读,直到没有其他内容可供阅读。
根据您的客户端,某些系统希望消息以特定终止字符结束/终止 - 即\ n或\ 0。大多数聊天应用程序要么检测要使用哪个,要么将其作为每条谨慎消息的一部分发送。