2012-12-16 166 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 +。