0

假设您有一个服务器和客户端使用 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))));  
4

1 回答 1

1

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

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

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

您如何处理客户端可能离线但需要接收他们在重新登录时错过的数据的事实?

客户端将保持离线状态多长时间以及多久创建一次新通知?如果客户离线时间过长,那么到那时她会收到很多通知。

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

于 2011-10-26T12:38:33.417 回答