2012-12-16 6 views
8

मैं एक 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 फ़ाइल का उपयोग करना चाहूंगा, इसलिए उपयोगकर्ता लॉग इन होने के बाद वह सर्वर पर संदेश भेजेगा, जो उन संदेशों को वापस जवाब देगा जिन्हें उपयोगकर्ता ने नहीं देखा है। जब मैं 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 शुरू करना चाहिए? या मुझे संदेश भेजने के लिए client($input) फ़ंक्शन का उपयोग करना चाहिए और फिर उसे वापस भेजना चाहिए, वापस? हालांकि, मैं चाहता था कि client उपयोग लॉग होने तक चलने के लिए, क्योंकि अन्य क्लाइंट चैट से कनेक्ट हो सकते हैं। मैं कैसे पूरा कर सकता हूं कि मेरे लिए यह अस्पष्ट है। client($input) में कोड client.php जैसा ही है।

+0

http://stackoverflow.com/questions/2055020/php-chat-client – sdolgy

+0

यह भी ध्यान रखें कि PHP को एक से अधिक अनुरोध चलाने के लिए डिज़ाइन नहीं किया गया है। लंबे समय तक चल सकता है (थोड़ी देर पहले चैट बॉट किया था) लेकिन यदि आप बहुत सावधान नहीं हैं तो आपको स्मृति को तोड़ने और दुर्घटनाग्रस्त होने का उच्च जोखिम है। निवासी ऐप्स के लिए अन्य भाषाएं अधिक उपयुक्त हो सकती हैं। – ToBe

उत्तर

1

ऑफ-विषय के लिए खेद है, लेकिन यदि आप कर सकते हैं, तो एक्सएमपीपी तैयार समाधान जैसे http-bind मॉड्यूल के साथ ejabberd सर्वर का उपयोग करना बेहतर होगा। निश्चित रूप से, कुछ ऐसे समाधान हैं जो इस तरह के समाधान हैं, लेकिन विपक्ष अधिक हैं। बस इस समाधान में देखें, शायद यह आपकी लागत को कम लागत के साथ हल करेगा।

मुझे लगता है कि मैं समझता हूँ कि क्या हो रहा है related answer with brief desc on XMPP solution

1

देखते हैं। लगता है जैसे आप श्रोता गायब हो सकते हैं? आम तौर पर चैट प्रोग्राम में क्लाइंट-साइड AJAX होता है जो किसी विशेष उपयोगकर्ता के लिए नियमित अंतराल पर संदेशों के लिए चेक या "सुनता" होता है।

उदाहरण के लिए, अगर किसी ने आपके डेटाबेस में उपयोगकर्ता एक्स के लिए कोई संदेश छोड़ा है (या जहां भी आप संदेश संग्रहीत कर रहे हैं), तो आपके पास कुछ जावास्क्रिप्ट हो सकता है जो प्रत्येक सेकेंड में एक php स्क्रिप्ट कहता है कि क्या कोई संदेश है या नहीं उपयोगकर्ता एक्स के लिए सर्वर। यदि वहां हैं, तो आप संदेश या संदेशों को वापस प्रतिबिंबित कर सकते हैं और उन्हें अपने AJAX कॉलबैक फ़ंक्शन के माध्यम से प्राप्त कर सकते हैं।

आप jQuery के साथ परिचित हैं, तो $ .Get विधि की जाँच: http://api.jquery.com/jQuery.get/

1

के रूप में मैं अपने प्रश्न को समझते हैं, आप के रूप में इस संदेश को हो जाता है क्लाइंट से सर्वर तक एक संदेश भेजने और जैसे ही करना चाहते हैं सर्वर के लिए यह सभी ग्राहकों को जवाब देगा ... मैं सही हूँ ???

मैं नोडजे और अन्य जावास्क्रिप्ट तकनीक का उपयोग करने जैसी कुछ चैट करता हूं ... और यह कहना चाहिए कि वेब सॉकेट का उपयोग करने का एक अच्छा विकल्प यहां है। browser support is limited को समझें, लेकिन चूंकि आपने यह निर्दिष्ट नहीं किया है कि किन ब्राउज़र को इसे चलाने की आवश्यकता है, मुझे लगता है कि जाने का एक शानदार तरीका है।

चेक इस संबंधित लिंक:

How to Use Sockets in JavaScript\HTML?

http://socket.io/

कर कि केवल php का उपयोग कर + js कुछ कार्य करना है और डाल एक setInterval में का एक संभावित तरीका सर्वर से अनुरोध करने के लिए हर 12 सेकंड मैंने 2005 में कुछ प्रकार की एएसपी चैट की जो इस दृष्टिकोण का उपयोग करता है। और मुझे कहना होगा कि वेब सॉकेट बहुत बेहतर है।

मुझे नहीं पता कि यह आपके प्रश्न का उत्तर दे रहा है ... मुझे बताएं!

+1

वेबस्केट समर्थन वास्तव में सभी मौजूदा डेस्कटॉप ब्राउज़र में सार्वभौमिक है, और node.js में पर्याप्त गिरावट है ताकि यह IE5.5 के बाद से सभी ब्राउज़रों पर काम करे। –

1

मैंने PHP और jQuery का उपयोग करने से पहले इन पंक्तियों के साथ कुछ विकसित किया। मैं जिस समाधान के लिए गया था वह सर्वर सेटअप (मेरे नियंत्रण से बाहर) पर प्रतिबंधों के कारण था। मैंने संदेश विंडो से संदेश सबमिशन बॉक्स में पृष्ठ के पूरे लेआउट को बनाने के लिए एक PHP कोर स्क्रिप्ट का उपयोग किया। पेज पर आने वाले किसी भी उपयोगकर्ता को यादृच्छिक रूप से जेनरेट किया गया उपयोगकर्ता दिया गया था जैसे उपयोगकर्ता 123234234 ने चैट पेज में प्रवेश किए समय से यूनिक्स टाइमस्टैम्प से उत्पन्न किया था।

सबमिट किए गए सभी संदेश एक XML फ़ाइल में संग्रहीत किए गए थे और एक नई एक्सएमएल फ़ाइल प्रतिदिन बनाई गई थी। उपयोगकर्ता को विभिन्न नोड विशेषताओं का उपयोग करके प्रत्येक संदेश के लिए उपयोगकर्ता के विवरण के साथ नीचे एक संदेश नोड में रखा गया था।

संदेश विंडो को jquery AJAX कॉल का उपयोग करके किसी अन्य PHP स्क्रिप्ट का उपयोग करके प्रत्येक 5 सेकंड में रीफ्रेश किया गया था जो एक्सएमएल में पढ़ता है कि दिन एक्सएमएल फ़ाइल केवल उस समय से जब उपयोगकर्ता चैट पेज में प्रवेश करता था।

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

इसके पीछे एक बहुत अधिक तर्क नहीं है लेकिन मैं इसे सबसे आसान पाया विकसित करने और बनाए रखने के लिए, मुझे आशा है कि यह बात आप सही दिशा में मदद करते हैं। और यह सभी प्रमुख ब्राउज़रों और आई 7 + से काम करता है।