一.服务器推送技术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 toName=@me 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 Id=@id", 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         }

转载于:https://www.cnblogs.com/fengxuehuanlin/p/5347347.html

Server push(服务器推送技术)相关推荐

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

    服务器推送技术(Server Push)是最近Web技术中最热门的一个流行术语,它的别名叫Comet(彗星).它是继AJAX之后又一个倍受追捧的Web技术.服务器推送技术最近的流行与AJAX有着密切的 ...

  2. java推送技术_java网络编程 - java服务器推送技术系列方案实战

    前言 服务器推送技术(又名Comet)是建立在ARP基础之上的一种非常实用的技术,它广泛应用于Web端,手机APP应用端等.具体很多场景都需要此技术的支撑,包括扫码登录.扫码支付.网页支付.端到端消息 ...

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

    转载:http://blog.csdn.net/shimiso/article/details/8151362 1 背景 "服务器推送技术"(ServerPushing)是最近We ...

  4. 服务器推送技术之——SSE

    一 点睛 服务器推送技术在日常开发中较为常用. SSE:Server send Event:服务端发送事件. 本项目推送技术是基于:当客户端向服务端发送请求,服务端会抓住这个请求不放,等有数据更新的时 ...

  5. 1.认识服务器推送技术

    最近需要使用服务器端往前台推送消息 ,所以查阅了相关资料 转载于:http://blog.csdn.net/zamaolangzi/article/details/7238688 仁兄的一篇文章, 服 ...

  6. 服务器推送技术的研究与应用

    3.1服务器推送技术(Server Push) 3.1.1服务器推送技术概述 服 务器推送技术是最近Web技术中最热门的一个流行术语,它是继AJAX之后又一个倍受追捧的Web技术.我们可以认为AJAX ...

  7. 深入了解 cometd的服务器推送技术

    简介:服务器推送技术已经出来一段时间了,业界上也有不少基于这种技术(应该说是设计模式)的开源实现,但是要移植或者说应用到自己的项目上都比较麻烦.Dojo 这样一个大型的 Web2.0 开发框架提供了一 ...

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

    1        背景 "服务器推送技术"( ServerPushing)是最近 Web技术中最热门的一个流行术语.它是继" Ajax "之后又一个倍受追捧的  ...

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

    越来越多的项目需要用到实时消息的推送与接收,怎样用ASP.NET实现最方便呢?我这里推荐大家使用GoEasy, 它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送! 浏览器兼容性:GoEa ...

最新文章

  1. Kubernetes StatefulSet源码分析
  2. python3 读取.plist文件_Python学习笔记 -5 - 文件操作
  3. 程序猿崛起——Growth Hacker
  4. AndroidStudio Gradle download
  5. 经典C语言程序100例之五七
  6. 火热的云计算,你知道这些吗?
  7. 1.10 编程基础之简单排序 06 整数奇偶排序 python
  8. 删除单词后缀(信息学奥赛一本通-T1141)
  9. linux中流设备_[快速上手Linux设备驱动]之块设备驱动流程详解一
  10. PosgreSQL快速参数调优和sysbench压测
  11. Java web中不同浏览器间导出Excel文件名称乱码问题解决方案
  12. python 查看文件名_python 查看文件名和文件路径
  13. SPSS新手教程—两步聚类之结果解读
  14. 躺平国历险记:两个超平面之间距离的计算
  15. Flash闪存颗粒和SSD知识深度解析
  16. win7如何修改html图标,Win7如何修改桌面图标
  17. luogu_1378 油滴扩展
  18. Python函数返回多个值的方法
  19. 示例填充图片_填充内容:工具,技巧和动态示例
  20. 这是一款功能强大的开源 Python 绘图库

热门文章

  1. 小程序怎么打出横线效果_小程序带横线的字体 微信小程序特殊字体
  2. 五个可以永远相信的神仙网站推荐
  3. 迷笛音乐学校 如何_适用于音乐迷的炫酷Vista侧边栏小工具
  4. 腾讯云网站备案咨询:网站命名基本要求
  5. 基于Echarts实现可视化数据大屏机械设备监测大数据统计平台HTML页面
  6. Ext.js5属性表格(更新数据)(handler和listener的区别)(蓝色的时候是蓝色的combo)(source)(19)
  7. 钙含量检测丨比色法检测试剂盒测定方案
  8. 关于Eclipse代码断点调试与相关快捷键
  9. linux 磁盘满了 预警,Linux磁盘空间满了的排查与解决思路
  10. python3画圆、直线_Bresenham直线算法与画圆算法