How to request on the server using the COMET method?

Asked

Viewed 427 times

3

I have a system, in which it displays database files, in list form.

I query the database every 5 seconds using the method Polling.

How do I use the method Comet? Since this method does not keep asking for information from the server all the time.

1 answer

1


It’s simpler than I initially thought. Basically, you have a page that does nothing until the data you want to send is available (for example, a new message is received).

Here is a very basic example, which sends a simple sequence after 2-10 seconds. 1 in 3 chances of returning an error 404 (to show manipulation in the example that comes Javascript error)

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));
?>

Note: With a real site running this on a regular web server, as Apache will quickly tie up all "work segments" and leave you unable to respond to other requests .. There are ways around this, but it is recommended to write a "Poll long server" on something like Python [twisted] (http://twistedmatrix.com/trac/), which does not depend on a thread per request. [cometd] (http://cometdproject.dojotoolkit.org/) is a popular one (which is available in several languages), and [Tornado] (http://www.tornadoweb.org/) is a new framework designed specifically for such tasks (which was built for Friendfeed’s long-voting code) ... but as a simple example, Apache is more than enough! This script can be easily written in any language (I chose Apache / PHP as they are very common, and I happened to be running them locally)

Then, in Javascript, you request the file above (msg_srv.php), and wait for an answer. When you get one, you act according to the data. Then you request the file and wait again, act according to the data (and repeat)

The following is an example of a page. When the page is loaded, it sends the initial request to the file msgsrv.php .. If successful, we add the message to the# messages div, after a second we call the waitForMsg function again, which triggers the wait.

The second setTimeout 1 () is a really basic rate limiter, it works great without it, but if msgsrv.php * always * returns immediately (with a syntax error, for example) - you flood the browser and it can quickly freeze. This would be best done by checking whether the file contains a valid JSON response, and / or maintaining a full run of requests per minute / second, and stopping accordingly.

If page errors, it adds the error to the # messages div, wait 15 seconds and then try again (identical to how we will wait a second after each message)

The nice thing about this approach is that it’s very tough. If the internet client connection dies, it will expire, then try to reconnect - this is inherent in how much voting time works, complicated error handling is required

Anyway, the long_poller.htm, using the jQuery framework:

<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>

Source: https://stackoverflow.com/questions/333664/how-to-implement-basic-long-polling

  • Ta, from what I understand you are using the long Polling method. I would like the Comet method

  • my excuse that I ass rs

  • 1

    @Mathdesigner47 I hope this documentation can help you http://imasters.com.br/artigo/12129/php/comet-server-push-com-xhr-multipart/

  • rsrs. without problems, I read the article, tested in my program and worked right

  • perfect friend of a plus ai that I thank

Browser other questions tagged

You are not signed in. Login or sign up in order to post.