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 つのクライアントに対して読み書きするよりもかなり複雑です。私の経験からすると、単一ユーザー システムから複数ユーザー システムへの移行は大きな飛躍です。そのため、チャット システムの書き方を試行錯誤しながら習得するには時間がかかります。

ただし、上記を実行することで問題を回避できると思います。これは、おそらくブロッキングと呼ばれるものが原因であると思います。システムは入力/出力を待ってから続行し、何も得られません。

基本的に、チャット アプリで考慮する必要があることがいくつかあります。

  1. php コマンド ラインからチャット スクリプトを実行する必要があります。ブラウザー内で実行すると、タイムアウトや、ブラウザーが Web ページの動作を正確にどのように期待するかに関して、より複雑な問題が発生します。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 に答える