在使用长轮询时,如何检测客户端是否订阅接收基于推送的通知



假设您有一个使用ajax递归订阅通知的服务器和客户机的长轮询情况,

var subscribe = function () {
$.get('http://localhost:1234', function (data) {
 // use the data                                
 subscribe(); // send another request
                });
            }

在服务器端,是否有一种可靠的方法来检测客户端是否真的在那里接收请求——换句话说,有人打开了页面并准备接收推送的数据?如何处理客户机可能处于脱机状态,但在重新登录时需要接收它们错过的数据?

我目前正在实现服务器使用响应式扩展的。net基于以下链接,

http://joseoncode.com/2011/06/17/event-driven-http-server-in-c-with-rx-and-httplistener/

 using (var server = new HttpServer("http://localhost:1234/"))
        {
            //the listeners stream and subscription
            var listeners = server
                    .Where(ctx => ctx.Request.HttpMethod == "GET")
                     //wait the next message to end the request
                    .Subscribe(ctx => subject.Take(1)                                                  .Subscribe(m => ctx.Respond(new StringResponse(m))));  

在服务器端,是否有可靠的方法来检测客户机实际上是用来接收请求的——换句话说,就是接收请求有人打开了页面并准备接收推送的数据?

我认为可靠的方法是等待客户端从服务器请求通知。

客户端请求需要有一个唯一的客户端id,服务器为那些成功订阅的客户端存储该id。如果id在那里,那就给他他想要的。

如何处理客户端可能离线但需要离线的情况收到他们重新登录时遗漏的数据吗?

客户端离线多长时间?创建新通知的频率是多少?如果客户端离线时间过长,那么到那时她会收到很多通知。

或者你的意思是客户订阅后失去了互联网连接。然后,每个客户端都需要一个队列,在客户端请求通知之前,通知将留在队列中。当客户端处于脱机状态时,消息将留在队列中。如果客户端离线时间过长,那么存储空间不会变大(假设您将使用redis或类似的东西),您可能需要一个衰减时间来清除队列中的消息。

相关内容

  • 没有找到相关文章