7

PHPチャットを作成しようとしているので、接続をserver.phpリッスンしているターミナルでサーバーを起動します。client

<?php

function chat_leave( $sock, $chat_id = 0 )
{
    if( $chat_room_id[ $chat_id ] )
    {
        unset( $chat_room_id[ $chat_id ] ); 
        return true;
    }
    socket_close($sock);
    return false;
}

function client( $input )
{
    /*
    Simple php udp socket client
    */

    //Reduce errors
    error_reporting(~E_WARNING);

    $server = '127.0.0.1';
    $port = 9999;

    if(!($sock = socket_create(AF_INET, SOCK_DGRAM, 0)))
    {
        $errorcode = socket_last_error();
        $errormsg = socket_strerror($errorcode);

        die("Couldn't create socket: [$errorcode] $errormsg \n");
    }

    //Communication loop
    while(1)
    {

        //Send the message to the server
        if( ! socket_sendto($sock, $input , strlen($input) , 0 , $server , $port))
        {
            $errorcode = socket_last_error();
            $errormsg = socket_strerror($errorcode);

            die("Could not send data: [$errorcode] $errormsg \n");
        }

        //Now receive reply from server and print it
        if(socket_recv ( $sock , $reply , 2045 , MSG_WAITALL ) === FALSE)
        {
            $errorcode = socket_last_error();
            $errormsg = socket_strerror($errorcode);

            die("Could not receive data: [$errorcode] $errormsg \n");
        }

        return $reply;
    }
}
/*
 * chat_join
 * a new user joins the chat
 * @username: String
 * @password: String
 * 
 * add a new listener to the server
 * 
 */
function chat_join( $username = "", $password = "" )
{
    $users = array(
        "batman" => "batman123",
        "robin"  => "robin123",
        "joe"    => "joe123"
    );
    if( $users[$username] == $password )
    {
        return true;
    }

    return false;   
}
function main()
{
    $chat_room_id = array();

    $username = stripslashes( $_POST['username'] );
    $password = stripslashes( $_POST['password'] );
    $action   = stripslashes( $_POST['action'] );
    $port     = intval( $_POST['port'] );
    $domain   = stripslashes( $_POST['domain'] );
    $chat_id  = intval( $_POST['chat_room_id'] );

    if( strcmp( $action, "login" ) == 0 )
    {
        $status = chat_join( $username, $password );
        if( $status )
        {
            $chat_room_id[] = $chat_id;
            echo json_encode( $status );
        }
    }
    else if( strcmp( $action, "chat" ) == 0 )
    {
        $msg = stripslashes( $_POST['message'] );
        // take the message, send through the client
        $reply = client( $msg );
        echo json_encode( $reply );
    }
    else if( strcmp( $action, "logout") == 0 )
    {

    }
    else
    {
        echo json_encode( false );
    }
    return;
}

main();

?>

この関数client()は、client.phpファイルから取得したコードであり、端末で実行すると、からメッセージを送受信できますserver.php。今度は自分のファイルを使用したいmain.phpので、ユーザーがログインすると、サーバーにメッセージを送信します。サーバーは、ユーザーが見たことのないメッセージを返信します。2つの異なる端末から実行するserver.phpclient.php、メッセージを送受信できますが、それを使用してmain.php、その返信メッセージをオブジェクトに変換し、ボックスに追加されるページにJSON送り返したいと思います。私の問題は、受信した返信を取得してhtmlページに送り返すにはどうすればよいですか?ターミナルで実行すると、次のようになります。htmltextareaclient.php

Enter a message to send : hello
Reply : hello

AJAXはチャットでユーザー入力を送信するために使用しているので、そのメッセージを取得して、端末で起動したサーバーに送信し、返信をWebページに転送して、に追加できるようにしたかったのです。テキストボックス領域。どうすればそれを達成できますか?client.phpを通じてサービスとして開始する必要がありmain.phpますか?または、このclient($input)関数を使用してメッセージを送信し、送信した内容を返す必要がありますか?clientただし、他のクライアントがチャットに接続する可能性があるため、使用がログアウトするまで実行したかったのです。どうすればそれを達成できますか?のコードclient( $input )はと同じclient.phpです。

4

4 に答える 4

1

PHP と jQuery を使用する前に、これらの方針に沿って何かを開発しました。私が行った解決策は、サーバーのセットアップの制限によるものでした(私の制御不能)。PHP コア スクリプトを使用して、メッセージ ウィンドウからメッセージ送信ボックスまでのページ全体のレイアウトを作成しました。このページにアクセスしたユーザーには、ランダムに生成されたユーザー (user123234234 のように、チャット ページに入った時点からの UNIX タイムスタンプから生成されたもの) が与えられました。

送信されたすべてのメッセージは XML ファイルに保存され、新しい XML ファイルが毎日作成されました。ユーザーは、さまざまなノード属性を使用するすべてのメッセージのユーザーの詳細とともに、以下のようなメッセージ ノードに保持されました。

メッセージ ウィンドウは、ユーザーがチャット ページに入った時点から、その日の XML ファイルのみを読み取る別の PHP スクリプトへの jquery AJAX 呼び出しを使用して、5 秒ごとに更新されました。

<messages>
    <message user="user123456" ip="127.0.0.1" session="{users session ID here}" time="{unix timestamp}"><![CDATA[User message here]]></message>
</messages>

その背後にはさらに多くのロジックがありますが、開発と保守が最も簡単であることがわかりました。正しい方向に向けるのに役立つことを願っています. また、すべての主要なブラウザーと IE7 以降で動作します。

于 2013-03-27T11:22:55.330 に答える
1

あなたの質問を理解しているので、クライアントからサーバーにメッセージを送信したいのですが、このメッセージがサーバーに届くとすぐに、すべてのクライアントに返信されます...私は正しいですか???

nodejs やその他の JavaScript 技術を使用するようなチャットを行います...ここでの優れたオプションは、Web ソケットの使用です。ブラウザのサポートが限られていることを理解してください。

この関連リンクを確認してください:

JavaScript\HTML でソケットを使用するには?

http://socket.io/

php + js のみを使用してそれを行う方法としては、何らかの関数を作成し、setInterval に入れて 12 秒ごとにサーバーにリクエストを送信する方法があります。2005 年に、このアプローチを使用するある種の ASP チャットを作成しました。そして、Web ソケットの方がはるかに優れていると言わざるを得ません。

それがあなたの質問に答えているかどうかわかりません...教えてください!

于 2013-03-27T11:15:25.443 に答える
1

何が起こっているのか理解していると思います。聞き手がいないように聞こえますか?通常、チャット プログラムには、特定のユーザーのメッセージを定期的にチェックまたは「リッスン」するクライアント側の ajax があります。

たとえば、誰かがデータベース (またはメッセージを保存している場所) にユーザー x へのメッセージを残した場合、サーバー上にユーザー x のメッセージがあるかどうかを確認するために毎秒 php スクリプトを呼び出す JavaScript を使用している可能性があります。 . 存在する場合は、1 つまたは複数のメッセージをエコー バックし、ajax コールバック関数を介して受信できます。

jQuery に精通している場合は、$.get メソッドを確認してください: http://api.jquery.com/jQuery.get/

于 2013-03-25T01:56:34.780 に答える
1

トピックから外れて申し訳ありませんが、可能であれば、http-bind モジュールを備えた ejabberd サーバーのような XMPP 対応のソリューションを使用することをお勧めします。確かに、そのようなソリューションにはいくつかの短所がありますが、短所の方が大きいです。このソリューションを見てください。低コストで問題を解決できるかもしれません。

XMPPソリューションの簡単な説明を含む関連する回答を参照 してください

于 2012-12-26T11:06:02.853 に答える