0

我想实现一个聊天应用程序,其中 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);
4

1 回答 1

1

为了实现一个聊天应用程序,您必须改进您的代码,以便它可以处理多个连接,这比读取和写入一个客户端要复杂得多。根据我的经验,从单用户系统到多用户系统是一个巨大的飞跃,这就是为什么需要时间来学习如何通过反复试验来编写聊天系统。

但是,我相信执行上述操作可以帮助您避免问题,我猜这很可能是由于所谓的阻塞- 系统在继续之前等待输入/输出并且没有得到任何结果。

基本上,使用聊天应用程序需要考虑以下几点:

  1. 你需要从 php 命令行运行你的聊天脚本,在浏览器中运行会给你带来更复杂的超时问题,以及浏览器期望网页如何工作。如果你使用 Mac OSX,你可以使用终端,如果你知道 linux,你显然可以使用 linux,如果你在 Windows 上......获取 puTTY 并连接到 linux 服务器,我相信你可以在 Windows 上运行 php 命令行,这只是我曾经尝试(或希望)做的事情。

  2. 您需要在用户评论http://uk.php.net/socket_selectsocket_select()中使用一些简单的示例来说明如何使用它。

  3. 您总是需要知道客户端处于什么状态 - 即仅在您可以阅读时读取,仅在您可以写入时写入......通常如果您可以读取或写入,那么您必须这样做才能保持内容工作顺利(并且不会最终冻结) - 正是由于这个原因,聊天应用程序非常棘手。

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

  5. 每当读写时——尤其是使用 php——读写函数可能不会一次性发送或接收所有信息。类似于fwrite()fread()您应该检查已写入多少内容(如果未完成则继续写入)并继续阅读,直到没有其他内容可供阅读。

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

于 2012-06-29T12:14:55.937 回答