2008-08-30 18 views
13

प्रोजेक्ट में मैं वर्तमान में काम कर रहा हूं, हमें एक बहुत ही जटिल चैट के बारे में बात करने के लिए दो लोगों को जोड़ने के लिए एक वेब चैट एप्लिकेशन विकसित करने की आवश्यकता है, हम एक बहुत ही विशिष्ट विषय के बारे में बात करने के लिए सिर्फ एक तरीका नहीं है, हम नहीं दो उपयोगकर्ताओं में से किसी एक के लिए प्रमाणीकरण की आवश्यकता है, हमें इमोटिकॉन्स, अवतार या उस तरह की चीजों का समर्थन नहीं करना है।अजाक्स मतदान

कुछ परियोजना सदस्यों ने सुझाव दिया कि हम बोश के माध्यम से एक्सएमपीपी का उपयोग कर सकते हैं, मैंने कहा कि नाव की जाल के साथ मछली पकड़ने की कोशिश की तरह, और एक सरल अजाक्स/माईएसक्यूएल वेब चैट की तरह एक और आसान तरीका प्रस्तावित किया गया है, लेकिन हम ' एक ही समय में कई चैटों के निरंतर मतदान के कारण सर्वर में प्रदर्शन हिट के बारे में चिंतित हैं।

क्या किसी ने पहले ऐसा कुछ किया है? आप क्या सुझाव देंगे?

उत्तर

6

आप Comet पर भी देखना चाहते हैं।

इसका उपयोग जीटीकॉक, मीबो और कई other chat applications द्वारा किया जाता है। कुछ साल पहले जब मैं इसका प्रयोग कर रहा था, तो इसे लागू करने के लिए सर्वर आर्किटेक्चर के बारे में बहुत सारी पुस्तकालय या विवरण नहीं थे, लेकिन ऐसा लगता है कि अब बहुत अधिक चीजें हैं।

अधिक तकनीकी जानकारी के लिए cometd प्रोजेक्ट पर एक नज़र डालें।

5

आप क्या सुझाएंगे? बकवास

के माध्यम से

XMPP

अपना खुद का संदेश प्रारूप और परिवहन प्रोटोकॉल का आविष्कार करने की जब कोई और व्यक्ति है कोई ज़रूरत नहीं है। यदि आप कोशिश करते हैं, तो यह धीरे-धीरे बोस के रूप में जटिल हो जाएगा लेकिन तीसरे पक्ष के लाइब्रेरी समर्थन या मानकीकरण के लाभ के बिना।

0

मैंने सोचा कि हर कोई इस तरह की चीज़ के लिए धूमकेतु का इस्तेमाल करता है।

2

आप धूमकेतु को भी देखना चाहते हैं।

मैंने सोचा कि हर कोई इस तरह की चीज़ के लिए धूमकेतु का इस्तेमाल करता है।

बीओएसएच HTTP पर एक्सएमपीपी परिवहन के लिए एक मानक है। इसमें ग्राहक को डेटा धक्का देने के लिए धूमकेतु शामिल है।

1

मैंने कुछ महीने पहले यह वही किया था और अवधारणाओं के साथ बस खेल रहा था। मैंने वास्तव में मतदान के बजाय forever-frame तकनीक का उपयोग किया।

नीचे कोड मेरी "धूमकेतु" जेएस फ़ाइल है जिसमें "पार्टी चैट" सेटअप प्राप्त करने के लिए आवश्यक सामान्य अवधारणाएं हैं।

function Comet(key) { 

    var random = key; 
    var title = 'Comet'; 
    var connection = false; 
    var iframediv = false; 
    var browserIsIE = /*@[email protected]*/false; 
    var blurStatus = false; 
    var tmpframe = document.createElement('iframe'); 
    var nl = '\r\n'; 

    this.initialize = function() { 
    if (browserIsIE) { 
     connection = new ActiveXObject("htmlfile"); 
     connection.open(); 
     connection.write("<html>"); 
     connection.write("<script>document.domain = '"+document.domain+"'"); 
     connection.write("</html>"); 
     connection.close(); 
     iframediv = connection.createElement("div"); 
     connection.appendChild(iframediv); 
     connection.parentWindow.comet = comet; 
     iframediv.innerHTML = "<iframe id='comet_iframe' src='./comet.aspx?key="+random+"'></iframe>"; 
    } else { 
     connection = document.createElement('iframe'); 
     connection.setAttribute('id', 'comet_iframe'); 
     iframediv = document.createElement('iframe'); 
     iframediv.setAttribute('src', './comet.aspx?key='+random); 
     connection.appendChild(iframediv); 
     document.body.appendChild(connection); 
    } 
    } 

    // this function is called from the server to keep the connection alive 
    this.keepAlive = function() { 
    if (!browserIsIE) { 
     mozillaHack(); 
    } 
    } 

    // this function is called from the server to update the client 
    this.updateClient = function (value) { 
    var outputDiv = document.getElementById('output'); 
    outputDiv.value = value + nl + outputDiv.value; 
    if (blurStatus == true) { 
     document.title = value; 
    } 
    if (!browserIsIE) { 
     mozillaHack(); 
    } 
    } 

    this.onUnload = function() { 
    if (connection) { 
     // this will release the iframe to prevent problems with IE when reloading the page 
     connection = false; 
    } 
    } 

    this.toggleBlurStatus = function(bool) { 
    blurStatus = bool; 
    } 

    this.resetTitle = function() { 
    document.title = title; 
    } 

    function mozillaHack() { 
    // this hack will fix the hour glass and loading status for Mozilla browsers 
    document.body.appendChild(tmpframe); 
    document.body.removeChild(tmpframe); 
    } 
} 
+0

इस तकनीक धूमकेतु पुस्तकालय आदि पर तीसरे पर जोड़ने बिल्ला के लिए rquired है की कोशिश कर सकते हैं:

अब मेरी अंग्रेजी की तुलना में बेहतर langage में बोलते हैं? या ठेठ servlet पर सेवा कर सकते हैं? क्या कोई डेमो/वर्किंग ऐप है जिसका हम उल्लेख कर सकते हैं? – cometta

+0

हमें comet.aspx का उदाहरण दिखा सकता है? – cometta

+0

इस तकनीक को उठने और चलाने के लिए IIS6 और .NET से परे कुछ भी आवश्यकता नहीं है। –

0

मैं जॉन से सहमत हूं। लेकिन एक और सवाल था जिसका जवाब नहीं दिया गया था।
मैंने यह किया है लेकिन डेटाबेस का उपयोग करने के बजाय हमने एक फ्लैट फ़ाइल का उपयोग किया, अंततः सर्वर को अपंग कर दिया, लेकिन यह तब तक नहीं था जब तक हमारे पास ~ 450 सक्रिय उपयोगकर्ता न हों, और यदि हमने इसे डेटाबेस के साथ किया होता तो शायद बेहतर प्रदर्शन किया है।
यह गोडाडी से मूल होस्टिंग खाते पर किया गया था।

संपादित करें: जब मुझे फोन कॉल मिला तो बीटीडब्ल्यू गोडाडी कम खुश हुए।

0

मुझे लगता है कि मतदान सबसे सरल दृष्टिकोण है और पहले इसकी सिफारिश करेगा। यदि लोड एक समस्या बन जाती है, तो अधिक जटिल तकनीकों की तलाश में। एक पक्ष-विपक्ष पर अच्छी चर्चा यहाँ हैं - Orbited - http://www.infoq.com/news/2007/07/pushvspull
http://ajaxian.com/archives/a-report-on-push-versus-pull

2

संदेश सर्वर से ब्राउज़र (डब Comet) को आगे बढ़ाने से निपटने के लिए एक बहुत अच्छा सर्वर नहीं है। यह आसानी से memcached की तरह अन्य प्रौद्योगिकियों (Django, रेल, पीएचपी आदि) के साथ एकीकृत है।

यदि आप गंभीर भार को संभालना चाहते हैं तो आपको वास्तव में इसकी जांच करनी चाहिए। अन्यथा, सरल अजाक्स मतदान सबसे अच्छा तरीका है।

1

चाल यह जानना है कि सर्वर पर सीजीआई का आह्वान करने की आवश्यकता केवल एक ही है जब कोई कुछ कहता है। नियमित चुनावों के लिए, एक स्थिर पृष्ठ पर मतदान करें जो आपकी सीजीआई स्क्रिप्ट अपडेट करता है जब भी नई बातचीत होती है। HEAD अनुरोधों का उपयोग करें, आखिरी बार देखे गए टाइमस्टैम्प की तुलना करें, और जब वे परिवर्तन करते हैं तो केवल पूर्ण प्राप्त करें। मेरे पास इस तरह से एक सरल बेवकूफ चैट एप्लिकेशन लागू किया गया है, और लोड और बैंडविड्थ उपयोग हमारे पास एक साथ उपयोगकर्ताओं के कुछ दसियों के लिए नगण्य है।

3

यदि आपको HTTP-मतदान के विचार को पसंद नहीं है, तो आपके पास चैट पेज पर एक फ्लैश-मूवी हो सकती है जिसमें सर्वर पर कुछ डीमॉन के साथ लगातार कनेक्शन होता है, फ्लैश-मूवी तब जावास्क्रिप्ट फ़ंक्शंस को लॉन्च करेगी चैट को अपडेट करने के लिए क्लाइंट नए संदेश के साथ आता है। (जब तक आप अपनी चैट के लिए फ्लैश इंटरफ़ेस नहीं चाहते ..)

0

चेकआउट Speeqe। वेब-आधारित चैट रूम के लिए यह open-source solution है जो दृश्यों के पीछे बोश और एक्सएमपीपी का उपयोग करता है।

0

मुझे अभी यह पोस्ट मिला है, यह पुराना है, लेकिन मतदान अवधारणा बहुत सारे लोगों के लिए परेशानी देती है। तो मैं यहां एक कार्यान्वयन उदाहरण डालूंगा। लेकिन इसे आपको देने से पहले, मुझे आपको सलाह दी जानी चाहिए कि मुझे कुछ समय पहले पागल बना दिया गया:

जब आप मतदान करते हैं, तो आपको सत्र व्यवहार (race conditions) का ख्याल रखना चाहिए। इसे सरल बनाने के लिए: यदि आप कोई सत्र खोलते हैं, तो सत्र फ़ाइल तब तक लॉक हो जाती है जब तक सत्र में बंद नहीं किया जाता है ताकि इसमें दो अलग-अलग डेटा लिखने से बचें। इसलिए, यदि आपको यह देखने के लिए सत्र की आवश्यकता है कि कोई उपयोगकर्ता लॉग है या नहीं, तो हमेशा मतदान से पहले सत्र बंद करें।

मेरा डेमो आपको PHP में मतदान कार्यान्वयन का एक उदाहरण देता है। मैं डेटाबेस का उपयोग नहीं करूंगा, बल्कि इसके बजाय एक फाइल का उपयोग करूंगा। जब आप मतदान बटन पर क्लिक करते हैं, तो आप लूप दर्ज करेंगे और फ़ाइल संशोधित होने तक, आप मतदान जारी रखेंगे। जब आप फॉर्म भरते हैं और रिलीज पर क्लिक करते हैं, तो आपने जो लिखा है उसे फ़ाइल में सहेजा जाएगा। फ़ाइल का संशोधन समय बदल जाएगा इसलिए मतदान बंद हो जाएगा।

युक्ति: क्या होता है यह देखने के लिए Firebug जैसे टूल का उपयोग करें।

<?php 

    // For this demo 
    if (file_exists('poll.txt') == false) { 
     file_put_contents('poll.txt', ''); 
    } 

    if (isset($_GET['poll'])) { 

     // Don't forget to change the default time limit 
     set_time_limit(120); 

     date_default_timezone_set('Europe/Paris'); 
     $time = time(); 

     // We loop until you click on the "release" button... 
     $poll = true; 
     $number_of_tries = 1; 
     while ($poll) 
     { 
      // Here we simulate a request (last mtime of file could be a creation/update_date field on a base) 
      clearstatcache(); 
      $mtime = filemtime('poll.txt'); 

      if ($mtime > $time) { 
       $result = htmlentities(file_get_contents('poll.txt')); 
       $poll = false; 
      } 

      // Of course, else your polling will kill your resources! 
      $number_of_tries++; 
      sleep(1); 
     } 

     // Outputs result 
     echo "Number of tries : {$number_of_tries}<br/>{$result}"; 
     die(); 
    } 

    // Here we catch the release form 
    if (isset($_GET['release'])) 
    { 
     $data = ''; 
     if (isset($_GET['data'])) { 
      $data = $_GET['data']; 
     } 
     file_put_contents('poll.txt', $data); 
     die(); 
    } 

?> 

<!-- click this button to begin long-polling --> 
<input id="poll" type="button" value="Click me to start polling" /> 

<br/><br/> 

Give me some text here : 
<br/> 
<input id="data" type="text" /> 
<br/> 

<!-- click this button to release long-polling --> 
<input id="release" type="button" value="Click me to release polling" disabled="disabled" /> 

<br/><br/> 

Result after releasing polling : 
<div id="result"></div> 

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script> 
<script type="text/javascript"> 

// Script to launch polling 
$('#poll').click(function() { 
    $('#poll').attr('disabled', 'disabled'); 
    $('#release').removeAttr('disabled'); 
    $.ajax({ 
     url: 'poll.php', 
     data: { 
      poll: 'yes' // sets our $_GET['poll'] 
     }, 
     success: function(data) { 
      $('#result').html(data); 
      $('#poll').removeAttr('disabled'); 
      $('#release').attr('disabled', 'disabled'); 
     } 
    }); 
}); 

// Script to release polling 
$('#release').click(function() { 
    $.ajax({ 
     url: 'poll.php', 
     data: { 
      release: 'yes', // sets our $_GET['release'] 
      data: $('#data').val() // sets our $_GET['data'] 
     } 
    }); 
}); 

</script> 

आप इसे here

संबंधित मुद्दे