各位,大家好,刚刚系统上线时遇到一个比较棘手的问题,请各位帮助一下。
问题具体是这样的,现在有8台客户端连接一个PC机,当PC机有消息要通知客户端时,通过后台的一个Notify类推送消息进客户端,客户端通过HTML5 的 Server-Sent Event的EventSource来收信息,具体如下:
if (!!window.EventSource) {
var source = new window.EventSource('../Service.ashxcmd=ServerSentEventHandler.Notify');
source.onopen = function(event) {
console.log("source.onopen");
}
source.onmessage = function(event) {
console.log('data:'+event.data);
}
source.onerror = function(event) {
console.log('error');
}
if (source == undefined) {
console.log("source == undefined");
return;
}
// source.addEventListener('message', function(e) {
//}, false);
source.addEventListener('open', function(e) {
console.log("connection was open");
}, false);
source.addEventListener("meetingclose", function(e) {
//var event = JSON.parse(e.data);
this.close();
loginout();
}, false);
后台简单推送方法:
public void Notify() { if (true == Request.AcceptTypes.Any<string>(accept => accept.Equals("text/event-stream"))) { Response.ContentType = "text/event-stream"; Response.CacheControl = "no-cache"; //Response.BufferOutput = false; //Response.Buffer = false; while (false == Application["meeting-closed"].ToPrimitiveType<bool>() && Response.IsClientConnected) { if (true == Response.IsClientConnected) { Response.Write("retry: 3000\n"); Response.Write("data: {\"msg\": \"keep-alive\"}\n\n"); Response.Flush(); } Thread.Sleep(5000); } if (false == Response.IsClientConnected) { Response.Flush(); Response.Close(); } } else { Response.Write("Client don't accept event-stream"); } }
后面代码省略,服务端推送消息到客户端,有10台客户端连着,随着时间推移,大概5分钟后,客户端接受的消息有点延迟,有点卡,大概会有7台可以收到,慢慢的减少5台,到最后1台,按我理解EventSource对象是一个不间歇运行的程序,时间一长会大量的耗资源,甚至导致客户端浏览器崩溃,那么如何优化这段执行代码呢?是优化这个EventSource还是服务端的推送类,小弟才刚学习HTML5,请各位大牛帮助一下,下周客户就需要看到效果了!!!!!!
不懂EventSource,看不出问题所在。不过既然是浏览器支持HTML5的话,改用websocket试试呗,实现也比较简单。我以前试过html5下的websocket,至少用它搭建个小型聊天室没有什么问题。