2012-12-16 131 views
8

我试图创建一个PHP聊天的聊天,让我有server.php启动终端上的服务器,这是听client连接:创建一个客户端在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(); 

?> 

功能client()是我从client.php文件得到的代码,当我在终端上执行时,它能够发送和接收来自server.php的消息。现在我想使用我的main.php文件,因此一旦用户登录,他将向服务器发送消息,服务器将回复用户没有看到的消息。 当我从两个不同的终端运行server.phpclient.php时,我可以发送和接收消息,但是我希望使用main.php来执行此操作,将该消息转换为JSON对象并发送回html页面,附加到textarea框中。 我的问题是:如何获得client.php收到的回复并将其发送回html页面? 当我执行它在终端上,我有:

Enter a message to send : hello 
Reply : hello 

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

+0

http://stackoverflow.com/questions/2055020/php-chat-c​​lient – sdolgy

+0

还要记住,PHP的设计不是运行时间超过一个请求。是否可以运行更长时间(前一段时间做过聊天机器人),但是如果你不是非常小心的话,你有很高的内存泄漏和崩溃风险。 其他语言可能更适合驻留应用程序。 – ToBe

回答

1

不好意思,但如果可以的话,最好使用带有http绑定模块的ejabberd服务器等XMPP就绪解决方案。当然,有一些缺点是这样的解决方案,但缺点更大。只要看看这个解决方案,也许它会以低成本解决您的问题。

看到related answer with brief desc on XMPP solution

1

我想我明白这是怎么回事。听起来你可能错过了一个听众?通常,聊天程序具有客户端ajax,它定期检查或“侦听”特定用户的消息。例如,如果某人在数据库中留下了针对用户x的消息(或存储消息的任何地方),则可能会有一些JavaScript每秒调用一次php脚本以查看是否有消息服务器为用户x。如果有,您可以回显消息或消息并通过您的ajax回调函数接收它们。

如果你熟悉的jQuery,检查出$不用彷徨方法:http://api.jquery.com/jQuery.get/

1

据我了解你的问题,你想从客户端发送信息到服务器,只要这个消息得到到服务器它将回复所有客户...我是正确的?

我做了一些像使用nodejs和其他javascript技术的聊天...并且必须说这里使用web套接字是一个很好的选择。意识到browser support is limited,但既然你没有指定什么浏览器需要运行,我认为这是一个好方法。

入住此相关链接:

How to Use Sockets in JavaScript\HTML?

http://socket.io/

这样做,只有使用PHP + JS是做一些功能,放在一个的setInterval的一种可能的方式,使请求到服务器的每12秒。我在2005年做了一些使用这种方法的asp聊天。我必须说网络套接字要好得多。

我不知道这是否回答你的问题...让我知道!

+1

Websocket支持在所有当前的桌面浏览器中都是普遍的,并且node.js具有足够的回退功能,因此它可以在IE5.5以后的所有浏览器上运行。 –

1

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

提交的所有消息都存储在一个XML文件中,并且每天都会创建一个新的XMl文件。用户被保存在下面的消息节点中,其中每个消息的用户的详细信息使用不同的节点属性。

消息窗口每5秒刷新一次,使用jQuery AJAX调用另一个PHP脚本,该脚本在XML中读取仅在用户进入聊天页面时的天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 +。