यह आसान है कि मैंने शुरू में सोचा था .. मूल रूप से आपके पास एक पृष्ठ है जो कुछ भी नहीं करता है, जब तक कि आप जो डेटा भेजना चाहते हैं वह उपलब्ध है (कहिए, एक नया संदेश आता है)।
यहां एक बहुत ही बुनियादी उदाहरण है, जो 2-10 सेकंड के बाद एक साधारण स्ट्रिंग भेजता है। 404 त्रुटि को वापस करने का 1 में 3 मौका (आने वाले जावास्क्रिप्ट उदाहरण में त्रुटि से निपटने के लिए)
msgsrv.php
<?php
if(rand(1,3) == 1){
/* Fake an error */
header("HTTP/1.0 404 Not Found");
die();
}
/* Send a string after a random number of seconds (2-10) */
sleep(rand(2,10));
echo("Hi! Have a random number: " . rand(1,10));
?>
नोट: एक वास्तविक साइट के साथ, अपाचे जैसे नियमित वेब-सर्वर पर इसे चलाने से सभी "कार्यकर्ता थ्रेड्स" जल्दी से जुड़ जाएंगे और इसे अन्य अनुरोधों का जवाब देने में असमर्थ हो जाएगा। इसके चारों ओर तरीके हैं, लेकिन इसे लिखने की सिफारिश की गई है पायथन के मुड़ की तरह कुछ में एक "लंबे समय से मतदान सर्वर" , जो प्रति अनुरोध एक थ्रेड पर निर्भर नहीं करता है। धूमकेतु एक लोकप्रिय एक है (जो कई भाषाओं में उपलब्ध है), और टॉर्नेडो एक नया ढांचा है जो विशेष रूप से ऐसे कार्यों के लिए बनाया गया है (इसे फ्रेंडफीड के लंबे-मतदान कोड के लिए बनाया गया था) ... लेकिन एक सरल उदाहरण के रूप में, अपाचे पर्याप्त से अधिक है ! यह स्क्रिप्ट आसानी से किसी भी भाषा में लिखी जा सकती है (मैंने अपाचे / PHP को चुना क्योंकि वे बहुत आम हैं, और मैं उन्हें स्थानीय रूप से चलाने के लिए हुआ)
फिर, जावास्क्रिप्ट में, आप उपरोक्त फ़ाइल ( msg_srv.php
) का अनुरोध करते हैं , और प्रतिक्रिया की प्रतीक्षा करें। जब आप एक प्राप्त करते हैं, तो आप डेटा पर कार्य करते हैं। फिर आप फ़ाइल का अनुरोध करें और फिर से प्रतीक्षा करें, डेटा पर कार्य करें (और दोहराएं)
इस तरह के पृष्ठ का एक उदाहरण इस प्रकार है .. जब पृष्ठ लोड किया जाता है, तो यह msgsrv.php
फ़ाइल के लिए प्रारंभिक अनुरोध भेजता है .. यदि यह सफल होता है, तो हम संदेश को #messages
div पर भेजते हैं, फिर 1 सेकंड के बाद हम फिर से waForMsg फ़ंक्शन को कॉल करते हैं: जो प्रतीक्षा को ट्रिगर करता है।
1 सेकंड setTimeout()
वास्तव में एक मूल दर-सीमक है, यह इसके बिना ठीक काम करता है, लेकिन अगर msgsrv.php
हमेशा तुरंत लौटता है (सिंटैक्स त्रुटि के साथ, उदाहरण के लिए) - आप ब्राउज़र को बाढ़ देते हैं और यह जल्दी से फ्रीज कर सकता है। यदि फ़ाइल में एक वैध JSON प्रतिक्रिया होती है, और / या प्रति-मिनट / सेकंड का कुल चल रहा है, और उचित रूप से रोक रहा है, तो यह बेहतर होगा।
यदि पृष्ठ त्रुटियां हैं, तो यह त्रुटि को #messages
div पर जोड़ता है , 15 सेकंड प्रतीक्षा करता है और फिर पुन: प्रयास करता है (प्रत्येक संदेश के लिए 1 सेकंड प्रतीक्षा करने के समान)
इस दृष्टिकोण के बारे में अच्छी बात यह है कि यह बहुत लचीला है। यदि क्लाइंट इंटरनेट कनेक्शन मर जाता है, तो यह समय समाप्त हो जाएगा, फिर प्रयास करें और पुन: कनेक्ट करें - यह अंतर्निहित है कि कितने समय में मतदान कार्य, कोई जटिल त्रुटि-हैंडलिंग की आवश्यकता नहीं है
वैसे भी, long_poller.htm
कोड, jQuery फ्रेमवर्क का उपयोग कर:
<html>
<head>
<title>BargePoller</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js" type="text/javascript" charset="utf-8"></script>
<style type="text/css" media="screen">
body{ background:#000;color:#fff;font-size:.9em; }
.msg{ background:#aaa;padding:.2em; border-bottom:1px #000 solid}
.old{ background-color:#246499;}
.new{ background-color:#3B9957;}
.error{ background-color:#992E36;}
</style>
<script type="text/javascript" charset="utf-8">
function addmsg(type, msg){
/* Simple helper to add a div.
type is the name of a CSS class (old/new/error).
msg is the contents of the div */
$("#messages").append(
"<div class='msg "+ type +"'>"+ msg +"</div>"
);
}
function waitForMsg(){
/* This requests the url "msgsrv.php"
When it complete (or errors)*/
$.ajax({
type: "GET",
url: "msgsrv.php",
async: true, /* If set to non-async, browser shows page as "Loading.."*/
cache: false,
timeout:50000, /* Timeout in ms */
success: function(data){ /* called when request to barge.php completes */
addmsg("new", data); /* Add response to a .msg div (with the "new" class)*/
setTimeout(
waitForMsg, /* Request next message */
1000 /* ..after 1 seconds */
);
},
error: function(XMLHttpRequest, textStatus, errorThrown){
addmsg("error", textStatus + " (" + errorThrown + ")");
setTimeout(
waitForMsg, /* Try again after.. */
15000); /* milliseconds (15seconds) */
}
});
};
$(document).ready(function(){
waitForMsg(); /* Start the inital request */
});
</script>
</head>
<body>
<div id="messages">
<div class="msg old">
BargePoll message requester!
</div>
</div>
</body>
</html>