Solving the Comet timeout problem
Turns out the answer is both easy and blindingly obvious once you think of it: the iframe onload event. And while we're add it, we'll add a onerror event too.
In my previous program, I had had a hidden iframe, and on every update, I would reset the source for the iframe using the location property.
We'll still do that, but add a new function:
<iframe name="hidden" src="CometCount" frameborder="0" height="0" width="100%"
onload="restartPoll()" onerror="restartPoll()" ></iframe>
Note the onload and onerror events - whenever the server closes the connection, these will be called. And here's the function that's called:
var retries = 0;
function restartPoll() {
if (retries++ > 10) {
alert("The connection has errored out too many times");
} else {
hidden.location = url;
}
}
Also, I've added a retry limit in there - it wouldn't do to have the client go into a fatal spin just because the server is down.
Now when the server closes the connection (from a timeout, or an error), the client will continue to function, automatically calling back into the server. Not a solution you'll want for every situation, but useful enough, especially for our small example.
Lastly, there was a bug in my previous version under IE - sorry about that. It turns out that if you send a POST via IE, you need to have a content body, or IE gets fussy. The fix is to change the line
xhReq.send(null);
to
xhReq.send("null");
I've uploaded new versions of the files index.html and CometCount.java, so you can see the complete code in context. - Login or register to post comments
- Printer-friendly version
- driscoll's blog
- 1450 reads





