效果圖:

主要是通過后臺線程來管理客戶端的連接狀態以及消息狀態.
webconfig配置
<appSettings>
<add key="IntervalTime" value="10000"/>間隔時間
<add key="HasDB" value="N"></add>是否查詢數據庫系統信息
<add key="ConnectInterval" value="4000"></add>連接間隔時間
</appSettings>


<httpHandlers>
<add verb="POST" path="ChatChannelHandler.ashx" type="MDS.Comet.ChatChannelHandler,Comet"/>發送消息
<add verb="*" path="ChatHandler.ashx" type="MDS.Comet.ChatHandler,Comet" validate="false"/>AJAX輪詢
</httpHandlers>
1.asp.net
當客戶段第一次連接的時候通過
ThreadPool.RegisterWaitForSingleObject(client.EventWaitHandle, new System.Threading.WaitOrTimerCallback(WaitOrTimerCallback), client, ConnectInterval, true)向線程池添加一個可以定時執行函數,
設置
public AutoResetEvent EventWaitHandle = new AutoResetEvent(false);
client.EventWaitHandle
的狀態,實現立即向客戶端發送消息,通過這個函數實現客戶端的長連接.保持客戶端的可持續性.
2.通過AJAX輪詢

ajax
function SetParameters(p,pSplit)
{
var option={length:'200',title:'',help:'None'};
properties=p.split(pSplit);
for(i=0;i<properties.length;i++)
{
namevalue = properties[i].split(':');
if(namevalue.length >1)
{
execute ="option." + namevalue[0] +'=\''+ namevalue[1]+'\';';
eval(execute);
}
}
return option;
}
function CometClient(handler, publicToken, privateToken, onmessage, ontimeout, oncancelled, onerror)
{
this.lastMessageId = 1000;
this.publicToken = publicToken;
this.privateToken = privateToken;
this.handler = handler;
this.onmessage = onmessage;
this.ontimeout = ontimeout;
this.oncancelled = oncancelled;
this.onerror = onerror;
this.running = true;
}
CometClient.prototype.stopWaiting = function()
{
this.running = false;
}
CometClient.prototype.startWaiting = function()
{
this.running = true;
this.waitForMessages();
}
CometClient.prototype.waitForMessages = function()
{
var me = this;
$.ajax(
{
url: this.handler,
type: "POST",
data: { privateToken: this.privateToken, lastMessageId: this.lastMessageId },
success: function(response)
{
var messages =null;
if(response!=null&&response!="")
{
messages =SetParameters(response,";");
}
if (messages != null && messages.length > 0)
{
var keepWaiting = me.running;
for (var i = 0; i < 1; i++)
{
if (me.lastMessageId < messages.MessageId)
me.lastMessageId = messages.MessageId;
switch (messages.Name.toLowerCase())
{
case "timedout":
me.ontimeout();
break;
case "cancelled":
keepWaiting = false;
me.oncancelled();
break;
case "message":
me.onmessage(messages);
break;
}
}
if (keepWaiting)
me.waitForMessages();
}
},
error: function()
{
me.onerror();
}
});
}
下載演示代碼
下載實現長連接的代碼COMET.DLL
另外另一種實現方法 實現
FluorineFx + Flex 實現 效果如下。
http://ftp-woody.d134.6266668.cn/chat2.aspx