首页 新闻 赞助 找找看

关于HTML5 Server-Sent Event长连接的一个问题

0
悬赏园豆:180 [待解决问题]

各位,大家好,刚刚系统上线时遇到一个比较棘手的问题,请各位帮助一下。

问题具体是这样的,现在有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,请各位大牛帮助一下,下周客户就需要看到效果了!!!!!!

乌索普船长的主页 乌索普船长 | 初学一级 | 园豆:22
提问于:2012-12-16 11:28
< >
分享
所有回答(2)
0

可以考虑改用其他的服务器端推消息

https://github.com/SignalR/SignalR

chenping2008 | 园豆:9836 (大侠五级) | 2012-12-16 15:44
0

不懂EventSource,看不出问题所在。不过既然是浏览器支持HTML5的话,改用websocket试试呗,实现也比较简单。我以前试过html5下的websocket,至少用它搭建个小型聊天室没有什么问题。

天方 | 园豆:5407 (大侠五级) | 2012-12-16 19:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册