.Net MVC 实现长轮询

什么是长轮询?

    长轮询是“服务器推”技术实现方式的一种,可以将服务端发生的变化实时传送到客户端而无须客户端频繁的地刷新、发送请求。

长轮询原理?

    客户端向服务器发送Ajax请求,服务器接收到请求后,保持连接不返回消息,直到进行相关处理完毕后才返回响应信息并关闭连接,客户端接收到响应信息后,进行相关处理,处理完毕后再想服务器发送新的请求。

长轮询的应用场景?

    长轮询常应用于Web及时通讯、监控、即时报价系统等需要实时将服务端的变化发送到客户端的场景。

长轮询的优缺点?

优点:无消息时不会频繁的向服务器发送请求。

缺点:服务器保持连接比较耗资源

实现:

前台代码:

我们在回调中,再次调用函数,使其在每次请求关闭后,开始下一次请求。

<div id="container"></div>
<script type="text/javascript">
    $(function () {
        function longPolling() {
            $.getJSON("/DateTime/GetTime", function (json) {
                $("#container").append(json.date + "<br/>");
                longPolling();
            });
        };
        longPolling();
    });
</script>

后台代码:

我们后台Controller要使用异步,继承AsyncController基类

public class DateTimeController : AsyncController
    {
        public void GetTimeAsync()
        {
            //计时器,5秒种触发一次Elapsed事件        
            System.Timers.Timer timer = new System.Timers.Timer(5000);
            //告诉.NET接下来将进行一个异步操作       
            AsyncManager.OutstandingOperations.Increment();
            //订阅计时器的Elapsed事件    
            timer.Elapsed += (sender, e) =>
            {  //保存将要传递给GetTimeCompleted的参数                
                AsyncManager.Parameters["nowdate"] = e.SignalTime;
                //告诉ASP.NET异步操作已完成,进行GetTimeCompleted方法的调用               
                AsyncManager.OutstandingOperations.Decrement();
            };
            //启动计时器       
            timer.Start();
        }
        public ActionResult GetTimeCompleted(DateTime nowdate)
        {
            return Json(new { date = nowdate.ToString("HH:mm:ss") + "  Welecom " }, JsonRequestBehavior.AllowGet);
        }
    }

转载于:https://www.cnblogs.com/ThinkWang/archive/2013/03/26/2982500.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java实现轮询(Long Polling)通常是为了实现实时通信或推送服务,它是一种HTTP请求优化技术。在轮询中,客户端向服务器发送一个HTTP GET请求,并保持连接打开,直到有新数据可用或超时才会关闭。如果服务器在此期间有新的消息,就立即响应;如果没有,则服务器不会发送任何内容,直到时间过期后自动断开并关闭连接。 以下是简单的Java实现轮询的步骤: 1. 客户端(浏览器或Web应用): - 使用JavaScript定时函数发起定期的GET请求到服务器。 - 如果服务器返回了数据,客户端处理数据并更新界面;否则等待一段时间(如5秒)后再尝试请求。 2. 服务器端(Java应用程序): - 当有新数据时,检查是否有未完成的时间等待请求。如果有,直接回应数据;如果没有,让请求等待指定的时间(例如最大轮询间隔)。 - 使用`HttpServletResponse#setKeepAlive(true)`来支持连接。 - 使用`ServletOutputStream#write()`或`BufferedOutputStream#write()`将数据发送回客户端。 ```java // Server-side (using Java Servlets) @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { if (!request.isAsyncSupported()) { // If async not supported, return immediately response.sendError(HttpServletResponse.SC_BAD_REQUEST); return; } // Check for new data boolean hasData = checkForNewData(); // Start an asynchronous response if needed AsyncContext ctx = request.startAsync(); ctx.setTimeout(60000); // Set timeout to a reasonable value try { if (hasData) { // If data is available, send it immediately sendData(response.getOutputStream()); } else { // No data yet, wait and poll again ctx.getAsyncExecutor().execute(() -> { Thread.sleep(5000); // Sleep for a while request.getRequestDispatcher("/").forward(request, response); }); } } catch (Exception e) { ctx.complete(e); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值