Server push(服务器推送技术)

一.服务器推送技术Server Push详解:

       推送技术Server Push的基础思想是将浏览器主动查询信息改为服务器主动发送信息。服务器发送一批数据,浏览器显示这些数据,同时保证与服务器的连接。当服务器需要再次发送一批数据时,浏览器显示数据并保持连接。以后,服务器仍然可以发送批量数据,浏览器继续显示数据,依次类推。

二.推送达到的效果:

三.实现原理分析:

    浏览器向服务器发出请求,服务器在连接数据库,在数据库中查找数据,若没查找到,就(continue结束本次循环,进行下一次循环),如果找到了就取出数据,然后就可以break结束了(在查询过程中很好资源,如果没找到可以通过多线程休眠5s后,在进行下次循环!

四.注意问题:

    1.如果使用的MySql数据库:mysql不支持top, top是Access的语法

应该使用limit 查询:select * from user where name = ‘xx‘ limit 1 注:limit 1(表示取第一条数据)

                                                                                           limit 2(表示取前两条数据)

                                                                                           limit 1,2(从第一个开始,去两条数据)

五.实现部分:

    • 浏览器部分:
<html>
<head>
    <title>ServerPush</title>
    <script src="jquery-2.1.4.js"></script>
    <script type="text/javascript">
        var login= function() {
            var me = $("#me").val();
            $.ajax({
                type: "post", url: "ServerPush.ashx",
                data: { action: "login", me: me },      //me当前登陆的用户
                success: function (data) {
                    $("#contest").append($("<li>" + data.Name + "对我说:" + data.Msg + "</li>"));
                    login();   //继续向服务器发送请求
                },
                error: function () {
                    login();  //有时可能出现网络异常,在这里重新发送请求
                }
            });
        }
        $(function () {
            $("#btnLogin").click(function () {
                //用户登陆
                $("#btnLogin").attr("disabled", "disabled");  //点击登陆后就禁用这个按钮
                login();  //向服务器发送请求获取发给我的数据
            });
            $("#btnSend").click(function () {
                //发送消息!
                var me = $("#me").val();
                var toName = $("#toUserName").val();
                var msg = $("#msg").val();
                $.ajax({
                    type: "post", url: "ServerPush.ashx",
                    data: { action: "send", toName: toName, msg: msg, me: me },//发送者:姓名和消息
                    success: function (data) {
                        $("#contest").append($("<li>我对" + data.toName + "说:" + data.Msg + "</li>"));
                    },
                    error: function () {
                        alert("推送异常");
                    }
                });
            });
        });
    </script>
</head>
<body>
     我是:<input type="text" id="me" /><input type="button" id="btnLogin" value="登陆" /><br />
    发给:<input type="text" id="toUserName" />
    说:<input type="text" id="msg" />
    <input type="button" id="btnSend" value="发送" /><br />
    <br />
    <ul id="contest">
    </ul>
</body>
    • 服务器端为(一般处理程序(.ashx)):
 1  public void ProcessRequest(HttpContext context)
 2         {
 3             context.Response.ContentType = "application/json";
 4             string action = context.Request["action"];  //获取是登陆进来的,还是发送消息进来的
 5             if (action == "login")
 6             {
 7                 string user = context.Request["me"];//当前登陆用户
 8                 while (true)
 9                 {                                                               //toName在数据库中查询发送我的所有消息
10                     DataTable table = SqlHelper.ExecuteQuery("select *from t_serverPush where [email protected] limit 1", new MySqlParameter("@me", user));
11                    if (table.Rows.Count <= 0)
12                    {
13                        Thread.Sleep(500);//如果没有查询到数据就就休息500毫秒,避免对数据库造成过大压力
14                        continue;
15                    }
16                    else
17                    {
18
19                         DataRow row = table.Rows[0];
20                         long id = (long)row["Id"];
21                         string me = (string)row["me"];
22                         string name = (string)row["toName"];
23                         string msg = (string)row["Msg"];
24                         SqlHelper.ExecuteNonQuery("delete from t_serverPush where [email protected]", new MySqlParameter("@id", id));
25                         var data = new { Name = me, Msg = msg };
26                         string json = new JavaScriptSerializer().Serialize(data);
27                         context.Response.Write(json);
28                         break;
29                    }
30                 }
31
32             }
33             else if (action == "send") //发送消息
34             {
35                 string user = context.Request["me"];
36                 string toName = context.Request["toName"];
37                 string Msg =context.Request["Msg"];
38                 SqlHelper.ExecuteNonQuery("insert into t_serverPush (me,toName,Msg) values (@me,@name,@msg)", new MySqlParameter("@me", user), new MySqlParameter("@name", toName), new MySqlParameter("@msg", Msg));
39                 var data = new { toName = toName, Msg = Msg };
40                 string json = new JavaScriptSerializer().Serialize(data);
41                 context.Response.Write(json);
42             }
43             else
44             {
45                 throw new Exception("action异常");
46             }
47         }
时间: 2024-11-05 06:14:30

Server push(服务器推送技术)的相关文章

HTTP 笔记与总结(9)分块传输、持久链接 与 反向 ajax(comet / server push / 服务器推技术)

反向 ajax 又叫 comet / server push / 服务器推技术 应用范围:网页聊天服务器,例如新浪微博在线聊天.google mail 网页聊天 原理:一般而言,HTTP 协议的特点是,连接之后断开连接(服务器响应 Content-Length,收到了指定 Length 长度的内容时,也就断开了).在 HTTP 1.1 协议中,允许不写 Content-Length,比如要发送的内容长度确实不知道,此时需要一个特殊的 Content-Type:chunked,叫做分块传输,只有当

Web端服务器推送技术原理分析

1 背景 "服务器推送技术"(ServerPushing)是最近Web技术中最热门的一个流行术语.它是继"Ajax"之后又一个倍受追捧的Web技术."服务器推送技术"最近的流行跟"Ajax "有着密切的关系. 随着 Ajax技术的兴起,让广大开发人员又一次看到了使用浏览器来替代桌面应用的机会,并且这次机会非常大.Ajax将整个页面的刷新变成页面局部的刷新,并且数据的传送是以异步方式进行,这使得网络延迟带来的视觉差异将会消失.

Web端服务器推送技术原理分析及dwr框架简单的使用

1 背景 “服务器推送技术”(ServerPushing)是最近Web技术中最热门的一个流行术语.它是继“Ajax”之后又一个倍受追捧的Web技术.“服务器推送技术”最近的流行跟“Ajax ”有着密切的关系. 随着 Ajax技术的兴起,让广大开发人员又一次看到了使用浏览器来替代桌面应用的机会,并且这次机会非常大.Ajax将整个页面的刷新变成页面局部的刷新,并且数据的传送是以异步方式进行,这使得网络延迟带来的视觉差异将会消失. 但是,在浏览器中的 Ajax应用中存在一个致命的缺陷无法满足传统桌面系

Web端服务器推送技术原理分析及dwr框架简单的使用 转载

1 背景 “服务器推送技术”(ServerPushing)是最近Web技术中最热门的一个流行术语.它是继“Ajax”之后又一个倍受追捧的Web技术.“服务器推送技术”最近的流行跟“Ajax ”有着密切的关系. 随着 Ajax技术的兴起,让广大开发人员又一次看到了使用浏览器来替代桌面应用的机会,并且这次机会非常大.Ajax将整个页面的刷新变成页面局部的刷新,并且数据的传送是以异步方式进行,这使得网络延迟带来的视觉差异将会消失. 但是,在浏览器中的 Ajax应用中存在一个致命的缺陷无法满足传统桌面系

HTML5中的服务器‘推送’技术 -Server-Sent Events

转帖:http://www.developersky.net/thread-63-1-1.html 一直以来,HTTP协议都是严格遵循Request-Response模型的.客户端发送一个Request到服务器,服务器对Request作出响应并将Response发送回客户端.也就是说,所有的互动都是由客户端发起的,服务器不会发起任何互动.为了创建互动性更强的web应用程序,AJAX出现了,AJAX实现了一个动态的从Server获取数据的方法.通过使用AJAX,浏览器通过XMLHttpReques

Web实时消息后台服务器推送技术GoEasy(支持多语言)---附GoEasy web 推送实例

越来越多的项目需要用到实时消息的推送与接收,怎样实现最方便呢?我这里推荐大家使用GoEasy, 它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送! 浏览器兼容性:GoEasy推送 支持websocket 和polling两种连接方式,从而可以支持IE6及其以上的所有版本,同时还支持其它浏览器诸如Firefox, Chrome, Safari 等等. 支持不同的开发语言:    GoEasy推送 提供了Restful API接口,无论你的后台程序用的是哪种语言都可以通过Restful

ASP.NET Web实时消息后台服务器推送技术---GoEasy

越来越多的项目需要用到实时消息的推送与接收,怎样用ASP.NET现最方便呢?我这里推荐大家使用GoEasy, 它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送! 浏览器兼容性:GoEasy推送 支持websocket 和polling两种连接方式,从而可以支持IE6及其以上的所有版本,同时还支持其它浏览器诸如Firefox, Chrome, Safari 等等. 支持不同的开发语言:    GoEasy推送 提供了Restful API接口,无论你的后台程序用的是哪种语言都可以通过

Python Web实时消息后台服务器推送技术---GoEasy

越来越多的项目需要用到实时消息的推送与接收,怎样用Python现最方便呢?我这里推荐大家使用GoEasy, 它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送! 浏览器兼容性:GoEasy推送 支持websocket 和polling两种连接方式,从而可以支持IE6及其以上的所有版本,同时还支持其它浏览器诸如Firefox, Chrome, Safari 等等. 支持不同的开发语言:    GoEasy推送 提供了Restful API接口,无论你的后台程序用的是哪种语言都可以通过R

Ruby Web实时消息后台服务器推送技术---GoEasy

越来越多的项目需要用到实时消息的推送与接收,怎样用Ruby现最方便呢?我这里推荐大家使用GoEasy, 它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送! 浏览器兼容性:GoEasy推送 支持websocket 和polling两种连接方式,从而可以支持IE6及其以上的所有版本,同时还支持其它浏览器诸如Firefox, Chrome, Safari 等等. 支持不同的开发语言:    GoEasy推送 提供了Restful API接口,无论你的后台程序用的是哪种语言都可以通过Res