![]() |
Web Development »
ASP.NET »
General
Intermediate
License: The Code Project Open License (CPOL)
ASP.NET and Comet: Bringing Sockets BackBy Wilfred VerkleyImplementing a socket based Comet solution in ASP.NET. |
C# (C# 3.0), Javascript, HTML, Windows, .NET (.NET 3.5), ASP.NET, Dev
|
|
Advanced Search Add to IE Search |
|
|
|
||||||||||||||||

Web pages and ASP.NET are wonderful tools, but as the old proverb goes, "if all you have is a hammer, everything seems like a nail". ASP.NET is a web technology, all of which exists to serve up resources to Web Browsers which request them. That's great, and it works for the vast majority of things currently on the Internet. In fact, when people think of the Internet, they mostly associate it with the ubiquitous World Wide Web model or its HTTP protocol. But, what if we want more...what if instead of Web Browsers just requesting resources, we want to push information actively out to them, without being asked first? Examples of this include: live wiki's, polls, chat, stock tickers, real-time auctions, and games.
This is where the existing paradigm fails, and we have to fall back to older technologies, the roots on which the Internet is founded....yes, I'm talking about actual two-way communication, interactivity, *gasp* sockets, TCP/IP!
Taking a step back, web requests can roughly be compared to a student asking a teacher questions. However, only the student is allowed to ask questions, the teacher cannot actively prompt the student with facts. This article sets out one experimental approach to breaking that model. Most of the current solutions, collectively called "Comet", involve the Web Browser keeping an active HTTP connection to the Web Server, like a student always keeping the teacher's attention. Presented here is another aproach, utilizing a "side-channel", where the "teacher" (that's the Web Server) doesn't spend as much attention or resources responding to pesky questions (web requests), and we can push information out instead, or engage in a more interactive way.
This article is inspired and partially based on the work and code by Alex MacCaw, the developer who created the Juggernaut extension to Ruby on Rails. But, why leave all the fun to those dynamic language people? Can't we have that in ASP.NET too? The answer is "yes we can".
How do we communicate with the Web Browser without it making a request first? One solution is to have the Web Browser keep open a socket connection directly to the server using a small light-weight Flash component.
What are the benefits of this aproach?
And yes, it does have drawbacks:
Comet applications can be divided into two categories:
The work flow for using Comet in a server-push scenario is:

In code, with a simple "GuestBook" example:
CometControl" on the ASP.NET web page:<CometControl
id="cometControl"
runat="server"
channel="GuestBook"></CometControl>
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
cometControl.Register();
}
AutoConnect" property is set to true (the default).UpdatePanel using ASP.NET AJAX extensions.protected void submitButton_Click(object sender, EventArgs e)
{
string name = nameTextBox.Text.Trim();
string text = commentTextBox.Text.Trim();
if (!string.IsNullOrEmpty(name) && !string.IsNullOrEmpty(text))
{
cometControl.Data = "guestbook_addComment ("
+ Wxv.Comet.Utility.SerializeJSON(
HttpContext.Current.Server.HtmlEncode(name))
+ "," + Wxv.Comet.Utility.SerializeJSON(
HttpContext.Current.Server.HtmlEncode(text)) + ");";
cometControl.Publish();
}
commentTextBox.Text = "";
}
guestbook_addComment = function(name, comment)
{
var commentsDiv = document.getElementById ("comments");
var e = document.createElement("blockquote");
e.innerHTML = comment + " - " + name + "";
commentsDiv.insertBefore (e, commentsDiv.firstChild);
}
The interactive scenario is very similar, but instead of the Web Browser doing postbacks or AJAX calls to the Web Server, the Web Browser uses its Comet connection to send data directly to an Application Client and vice versa.
The work flow for using Comet in an interactive scenario is:

The Web Browser code is still very similar, but now, instead of doing AJAX calls or postbacks, we can just send data to our actively listening Application Client over the Comet connection.
E.g.: in response to a button click in a "sound player" application:
function sounds_click(soundId)
{
comet.send (soundId);
}
The Comet Server is a simple event handling and messaging component that accepts two types of connections:
It responds to the following Client events:
It sends the following events to any Client that has subscribed to the related channel.
Both the Comet Server and the Client component, which Application Clients can be written with, are simple components. The Comet Server component is self-contained, the only interaction needed is to get it to start and stop, and it can be easily hosted in a Windows application, a Service, or even in the Web Server itself. Similarly, the Client is a simple component (which the CometControl already encapsulates) which exposes some simple methods and events (on a single thread) which can easily be extended to write your own Application Clients which can also be hosted in a variety of ways.
Web browsers opening socket connections to a server isn't actually that new. In their isolated little sandboxes, Java applets have been doing it since they were invented more then a decade ago, and Flash has had the capability for a while too. Microsoft's Silverlight will eventually be getting it in version 2.0. All that the Comet approaches are trying to do is get a similar capability directly within the web browser itself.
I've had fun with this project, exploring a Comet solution for ASP.NET. I don't pretend that it's anything more than it is, a toy project; so consume and eat it with a grain of salt (and credit me if it tastes nice). For this author however, it gave an interesting insight to what's possible.
General
News
Question
Answer
Joke
Rant
Admin
|
PermaLink |
Privacy |
Terms of Use
Last Updated: 9 Apr 2008 Editor: Smitha Vijayan |
Copyright 2008 by Wilfred Verkley Everything else Copyright © CodeProject, 1999-2009 Web19 | Advertise on the Code Project |