在PHP中创建聊天客户端

在PHP中创建聊天客户端,php,html,ajax,json,Php,Html,Ajax,Json,我正在尝试创建一个PHP聊天,因此我有了server.PHP,它在终端上启动服务器,即侦听客户端连接: <?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);

我正在尝试创建一个
PHP
聊天,因此我有了
server.PHP
,它在终端上启动服务器,即侦听
客户端
连接:

<?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();

?>
我使用
AJAX
在聊天中发送用户输入,因此我希望能够接收该消息,并将其发送到服务器,我在终端上启动该服务器,将回复返回并转发到网页,并将其附加到文本框区域。 我怎样才能做到这一点?我应该通过
main.php
作为服务启动
client.php
?或者我应该使用
client($input)
函数发送消息,然后返回它发送的内容吗?
但是,我希望
client
在用户注销之前一直运行,因为其他客户端可能会连接到聊天室。我如何才能做到这一点对我来说有点模糊。
client($input)
中的代码与
client.php

中的代码相同,很抱歉没有主题,但是如果可以的话,最好使用XMPP就绪的解决方案,比如带有http绑定模块的ejabberd服务器。当然,这种解决方案有一些缺点,但缺点更大。看看这个解决方案,也许它能以低成本解决您的问题


我想我明白发生了什么。听起来你可能错过了一个听众?通常聊天程序都有客户端ajax,定期检查或“侦听”特定用户的消息

例如,如果有人在您的数据库(或存储消息的任何位置)中为用户x留下消息,您可能会有一些javascript每秒调用一个php脚本,以查看服务器上是否有针对用户x的消息。如果有,您可以通过ajax回调函数回显消息并接收它们


如果您熟悉jQuery,请查看$.get方法:

据我所知,您希望从客户端向服务器发送一条消息,一旦该消息到达服务器,它将立即回复所有客户端。。。我是对的

我用nodejs和其他javascripts技术聊天。。。必须说,这里有一个很好的选择就是使用web套接字。认识到这一点,但由于您没有指定运行此功能所需的浏览器,我认为这是一个很好的方法

请查看以下相关链接:

只有使用php+js才能做到这一点的一种可能方法是生成一些函数并放入setInterval,以便每12秒向服务器发出一次请求。我在2005年做了一些asp聊天,使用这种方法。我必须说web套接字要好得多


我不知道这是否回答了你的问题。。。让我知道

在使用PHP和jQuery之前,我开发了一些类似的东西。我选择的解决方案是由于服务器设置的限制(我无法控制)。我使用了一个PHP核心脚本来创建从消息窗口到消息提交框的整个页面布局。任何进入该页面的用户都会得到一个随机生成的用户,如用户123234234,该用户是从进入聊天页面时根据unix时间戳生成的

<messages>
    <message user="user123456" ip="127.0.0.1" session="{users session ID here}" time="{unix timestamp}"><![CDATA[User message here]]></message>
</messages>
提交的所有消息都存储在一个XML文件中,每天都会创建一个新的XML文件。用户被保存在如下所示的消息节点中,每个消息都使用不同的节点属性提供用户的详细信息

消息窗口每5秒刷新一次,使用jquery AJAX调用另一个PHP脚本,该脚本仅从用户进入聊天页面时读取XML文件

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


它背后有很多逻辑,但我发现它是最容易开发和维护的,我希望它能帮助您找到正确的方向。它可以在所有主流浏览器和IE7+上运行。

还请记住,PHP的设计运行时间不会超过一个请求。Is可以运行更长的时间(不久前做了一个聊天机器人),但是如果你不是很小心,你有很高的内存泄漏和崩溃的风险。其他语言可能更适合常驻应用程序。Websocket支持实际上在所有当前桌面浏览器中都是通用的,node.js具有足够的回退功能,因此它可以在IE5.5之后的所有浏览器上工作。