我正在尝试创建一个 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),$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文件,因此一旦用户登录,他将向服务器发送消息,服务器将回复用户未看到的消息.
当我从两个不同的终端运行server.PHP和client.PHP时,我能够发送和接收消息,但是我想使用main.PHP这样做,将该回复消息转换为JSON对象并发送回html页面,它将被附加到textarea框.
我的问题是:如何获得client.PHP收到的回复并将其发送回html页面?
当我在终端上执行它时,我有:

Enter a message to send : hello
Reply : hello

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

对于偏离主题感到抱歉,但如果可以的话,最好使用带有http-bind模块的ejabberd服务器等XMPP就绪解决方案.当然,有一些缺点是这样的解决方案,但缺点是更大.只需看看这个解决方案,也许它会以低成本解决您的问题.

见related answer with brief desc on XMPP solution

在PHP中为聊天创建客户端的更多相关文章

  1. 不推荐使用Xamarin Android SetBackgroundDrawable但不支持SetBackground()

    解决方法使用Background属性.通常,只要Android具有不带参数的getX/setX方法,Xamarin就会将其转换为名为X的C#样式属性.

  2. php – Facebook Chat Bot – 如何测试欢迎信息?

    我的聊天机器人工作得很好,但是我在调试欢迎消息功能时遇到了问题,因为它只在会话启动时出现.如何重置聊天,以便将我视为与之交互的新用户?这是我目前欢迎的PHP脚本试试这个:>在桌面浏览器中打开Facebook,然后转到链接到messengerbot的页面>按“消息”>在消息弹出/讨论内选择“选项”>选择“删除对话…”并在确认提示中说“删除对话”>再次选择“消息”>选择“开始使用”第4步.真的删除你使用页面/应用程序的聊天记录,所以要小心.

  3. php – 如何执行ajax函数onbeforeunload?

    我正在开发一个PHP/javascript聊天.当用户登录时,他/她的用户名被插入到称为队列的MySQL表中.此插入返回将存储在名为$_SESSION[‘CHAT_QUEUE_ID’]的会话变量中的MysqL_insert_id()当用户关闭页面时,我需要删除MysqL表行.我试过以下,但没有成功:js文件chat.PHP有没有办法做到这一点?

  4. PHP套接字侦听循环

    使用以下代码,我可以收到1个请求并写入:但是一旦收到1个数据包就会自动收听.我需要继续接收数据包,直到收到退出或任何关闭命令.我应该如何更改上面的代码才能使这个函数成为一个循环?如果请求将退出监听将关闭.该方法已经过测试:)并且可行.

  5. 如何知道PHP中的对等点何时重置连接?

    id=34380所以无论如何都知道FIN_WAIT信号何时被提升?谢谢,我认为它不可能是stream_socket系列,看起来它的级别太高了.我尝试制作一个非常hackish的解决方案,我不知道它是否适合你,它不是很可靠:启动:PHP./server.PHP连接:nclocalhost8000|头-c1服务器输出:

  6. php – 未捕获的异常:jQuery UI选项卡:不匹配的片段标识符

    JQueryUI选项卡插件期望内容div与ul链接位于同一容器中.在你的情况下,它希望内容div在ul下的divid=“chatChannel”中,但它们不在那里.

  7. 在PHP中为聊天创建客户端

    当我在终端上执行它时,我有:我使用AJAX在聊天中发送用户输入,所以我希望能够接收该消息,并将其发送到服务器,我在终端上启动并回复并转发到网页并将其附加到文本框区域.我怎么能做到这一点?我应该通过main.PHP启动client.PHP作为服务吗?或者我应该使用客户端函数发送消息,然后返回它发送的内容,返回?

  8. GMail Chat如何在无客户端互动的情况下制作AJAX请求?

    所有HTTP响应都需要客户端启动它们,即使是使用AJAX的。但GMail的聊天功能能够接收来自其他用户的消息,即使我只是坐在我舒适的电脑椅子看,但不与浏览器进行交互。这种技术被称为“彗星”,也被称为“服务器推送”,“反向ajax”等。它是关于将数据从服务器推送到浏览器,保持http连接活着。查找更多信息在它上wikipediaarticle。

  9. CentOS下高并发socket最大连接数所受的各种限制

    也就是说缺省情况下,基于Linux的通讯程序最多允许同时1014个TCP并发连接。如果系统回显类似于“Operationnotpermitted”之类的话,说明上述限制修改失败,实际上是因为在中指定的数值超过了Linux系统对该用户打开文件数的软限制或硬限制。通过上述步骤,就为支持高并发TCP连接处理的通讯处理程序解除关于打开文件数量方面的系统限制。

  10. Windows平台的原始套接字编程的知识点概要备忘

    写这篇文章是为了温故知新,照着Windows网络编程一书第7章内容而写。原始套接字提供普通套接字不具备的能力有:发送和接收内核不处理其协议字段的IPv4数据包。传递到原始套接字中的数据包会根据接收条件决定是否拷贝,若满足则拷贝到原始套接字的接收缓冲区中。如果原始套接字无法满足需求,还有WInPcap编程直接操控数据帧。

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部