一.服务器推送技术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)):
  public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "application/json";
string action = context.Request["action"]; //获取是登陆进来的,还是发送消息进来的
if (action == "login")
{
string user = context.Request["me"];//当前登陆用户
while (true)
{ //toName在数据库中查询发送我的所有消息
DataTable table = SqlHelper.ExecuteQuery("select *from t_serverPush where toName=@me limit 1", new MySqlParameter("@me", user));
if (table.Rows.Count <= )
{
Thread.Sleep();//如果没有查询到数据就就休息500毫秒,避免对数据库造成过大压力
continue;
}
else
{ DataRow row = table.Rows[];
long id = (long)row["Id"];
string me = (string)row["me"];
string name = (string)row["toName"];
string msg = (string)row["Msg"];
SqlHelper.ExecuteNonQuery("delete from t_serverPush where Id=@id", new MySqlParameter("@id", id));
var data = new { Name = me, Msg = msg };
string json = new JavaScriptSerializer().Serialize(data);
context.Response.Write(json);
break;
}
} }
else if (action == "send") //发送消息
{
string user = context.Request["me"];
string toName = context.Request["toName"];
string Msg =context.Request["Msg"];
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));
var data = new { toName = toName, Msg = Msg };
string json = new JavaScriptSerializer().Serialize(data);
context.Response.Write(json);
}
else
{
throw new Exception("action异常");
}
}

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

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

    反向 ajax 又叫 comet / server push / 服务器推技术 应用范围:网页聊天服务器,例如新浪微博在线聊天.google mail 网页聊天 原理:一般而言,HTTP 协议的特点是 ...

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

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

  3. 深入了解 Dojo 的服务器推送技术

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...

  4. JavaEE开发之SpringMVC中的静态资源映射及服务器推送技术

    在上篇博客中,我们聊了<JavaEE开发之SpringMVC中的自定义拦截器及异常处理>.本篇博客我们继续的来聊SpringMVC的东西,下方我们将会聊到js.css这些静态文件的加载配置 ...

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

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

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

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

  7. 基于comet服务器推送技术(web实时聊天)

    http://www.cnblogs.com/zengqinglei/archive/2013/03/31/2991189.html Comet 也称反向 Ajax 或服务器端推技术.其思想很简单:将 ...

  8. web服务器推送技术

    传统模式的 Web 系统以客户端发出请求.服务器端响应的方式工作.不能满足很多现实应用的需求,譬如: 监控系统:后台硬件温度.电压发生变化: 即时通信系统:其它用户登录.发送信息: 即时报价系统:后台 ...

  9. HTML5中的SSE(服务器推送技术)

    本文原链接:https://cloud.tencent.com/developer/article/1194063 SSE技术详解:一种全新的HTML5服务器推送事件技术 前言 概述 基本介绍 与We ...

随机推荐

  1. iOS 开发新版 动态库framework

    0. 参考 http://www.cocoachina.com/industry/20140613/8810.html framework+xib参考 : http://blog.csdn.net/x ...

  2. redis3 list类型

    list类型及操作list是一个链表结构,主要功能是push,pop.获取一个范围的所有值等,操作中key理解为链表的名字.redis的list类型其实就是一个每个子元素都是string类型的双向链表 ...

  3. [ Android 五种数据存储方式之四 ] —— ContentProvider存储数据

    Android这个系统和其他的操作系统还不太一样,我们需要记住的是,数据在Android当中是私有的,当然这些数据包括文件数据和数据库数据以及一些其他类型的数据.那这个时候有读者就会提出问题,难道两个 ...

  4. Weblogic常见故障常:JDBC Connection Pools

    http://blog.csdn.net/woshixuye/article/details/24122579 有些时候是数据库连接池出现了问题,测试的时候显示没有连接池了,重启WebLogic都不行 ...

  5. 游戏开发之在UE4中编写C++代码控制角色

    当你运行我们上次做完的项目,你可能会意识到我们移动的摄像机还是默认的那个摄像机,这个默认的摄像机可以自由飞翔.这一节,我们要使得开始的角色是我们的一个Avatar类的实例对象,并且使用键盘控制我们的角 ...

  6. Postman编程

    Postman常用Api Postman像jmeter一样提供前置处理脚本和后置处理脚本.脚本主要使用JavaScript语法,并内置提供了一些js代码库,提供了一些内置对象和方法. 参考:https ...

  7. 设计模式之单一职责原则(SRP)

    自己之前写过一些关于设计模式的博客,但是大部分都写得比较匆忙.现在正好趁年前有时间,笔者打算好好地整理一下自己这块知识结构.开篇的第一个原则就是设计原则里面最简单的一个原则--单一职责原则. 想必大家 ...

  8. vue-router跳转页面

    小结放在前:先祝大家新年快乐!鸡年大吉大利!在新的一年里大家都有跳跃般的成长!作为新年的第一篇文章,就拿他来给大家拜个年!!!文章前部份讲解了vue-router路由的配置,后半部分为去年的文章vue ...

  9. DTLS-PSK算法抓包解析

    一.DTLS -PSK PSK 是DTLS 定义的密钥交换方案之一,相对于公钥证书方案(如 ECDHA_RSA) 来说,其具备更加轻量化.高效的优点: 而目前 PSK方案应用也比较广泛. 关于DTLS ...

  10. iOS真机测试友盟碰到错误linker command failed with exit code 1 (use -v to see invocation) 百度地图的检索失败 sqlite 错误码

    因为友盟不支持bitcode 在模拟器上运行正常,但是在模拟器上就会报错,这是因为xocde7之后增加了一个bitcode,bitcode是被编译程序的一种中间形式的代 码.包含bitcode配置的程 ...