ASP.NET中ServerPush用法实例分析_实用技巧

本文实例讲述了ASP.NET中ServerPush用法。分享给大家供大家参考。具体分析如下:

什么是ServerPush,服务器向客户端“推送“,其实就是”长连接“

只有浏览器请求服务器端,服务器端才给浏览器响应数据,不会主动向浏览器推送数据,这是一种安全考虑,也是提高服务器的性能考虑,如果服务器向浏览器主动推送数据,就要用到ServerPush等技术模拟实现。

举个例子:

通过两个页面互相发送消息实现,消息放到数据库。

/// <summary>
/// ServerPush1 的摘要说明
/// </summary>
public class ServerPush1 : IHttpHandler
{
  public void ProcessRequest(HttpContext context)
  {
   context.Response.ContentType = "application/json";
   string action = context.Request["action"];
   if (action == "send")//发送
   {
    string me = context.Request["me"];
    string toUserName = context.Request["toUserName"];
    string msg = context.Request["msg"];
    SQLHpler.ExecuteNonQuery("INSERT INTO T_Msgs(FromUserName,ToUserName,Msg) VALUES(@FromUserName,@ToUserName,@Msg)", new SqlParameter("@FromUserName", me),
     new SqlParameter("@ToUserName", toUserName),
     new SqlParameter("@Msg", msg));
    context.Response.Write(new JavaScriptSerializer().Serialize(new { Status = "ok" }));
   }
   else if (action == "receive")
   //登陆,并持续查询、接收对方发过来的数据
   {
    //做一个简单的例子,以ServerPush1.ashx?me=sean
    //请把发给sean的消息发给我一条
    string me = context.Request["me"];
    while (true)
    {
     DataTable dt = SQLHpler.ExecuteQuery("SELECT TOP 1 * FROM T_Msgs WHERE ToUserName=@ToUserName",new SqlParameter("@ToUserName", me));
     if (dt.Rows.Count <= 0)
     {
      Thread.Sleep(500);//没找到,休息500ms再查询,这样避免对数据库的查询压力,和占用WEB服务器CPU资源
      continue;//下一次while
     }
     else
     {
      DataRow row = dt.Rows[0];
      long id = (long)row["Id"];
      string fromUserName = (string)row["FromUserName"];
      string msg = (string)row["Msg"];
      //查询完之后要删除消息,否则会出现死循环,不停的给页面输出同一个消息
      SQLHpler.ExecuteNonQuery("DELETE FROM T_Msgs WHERE Id=@Id",new SqlParameter("@Id",id));
      //创建一个匿名对象,将查询到的数据存到里面
      var data = new { FromUserName = fromUserName, Msg = msg, Id = id };
      string json = new JavaScriptSerializer().Serialize(data);//将匿名对象转换为json
      context.Response.Write(json);//将请求结果以json格式返回
      break;
     }
    }
   }
   else
   {
    throw new Exception("action错误");
   }
}
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<script type="text/javascript" src="jquery-1.8.3.min.js"></script>
<script type="text/javascript">
var rev = function () {
 var mine = $('#me').val();
 $.ajax({
  type: 'post', url: 'serverPush1.ashx',
  data: { action: 'receive', me: mine },//传给serverPush.ashx根据me查找发给me的消息
  success: function (data) {
   $('#ulMsg').append($('<li>' + data.FromUserName + '对我说:' + data.Msg + '</li>'));
   rev();//收到消息后再向服务器请求数据,再给我一条消息
  },
  error: function () {
   rev();
   //哪怕网络请求失败(比如用户网络故障),也再次发送请求
  }
 });
};
$(function () {
 //发送
 $('#btnSend').click(function () {
  var myName = $('#me').val();
  var toUserName = $('#toUserName').val();
  var msg = $('#msgContext').val();
  $.ajax({
   type: 'post', url: 'serverPush1.ashx',
   data: { action: 'send', me: myName, toUserName: toUserName, msg: msg },//根据用户输入的信息,传到服务端ServerPush.ashx进行插入操作
   success: function (data) {
    if (data.Status == 'ok') {//如果发送成功,
     $('#ulMsg').append($('<li>我对' + toUserName + '说:' + msg + '</li>'));
     $('#msgContext').val('');
    }
    else {
     alert('发送出错,返回报文无法识别');
    }
   },
   error: function () {
    alert('发送出错');
   }
  });
 });
 //登陆,接收数据
 $('#btnLogin').click(function () {
  rev();
  $(this).attr("disabled", "disabled");
 });
 /*
 $('#btnLogin').click(function () {//接收
  var mine = $('#me').val();
  $.ajax({
   type: 'post', url: 'serverPush1.ashx',
   data: { action: 'receive', me: mine },
   //传给serverPush.ashx根据me查找发给me的消息
   success: function (data) {
    $('#ulMsg').append($('<li>' + data.toUserName + '对我说:' + data.msg + '</li>'));
   },
   error: function () {
    alert('接收失败');
   }
  });
 });*/
});
</script>
</head>
<body>
 发送人:<input type="text" id="me" /><input type="button" id="btnLogin" value="登陆" style=""/><br />
 接收人:<input type="text" id="toUserName" /><br />
 输入消息:<input type="text" id="msgContext" /><input type="button" id="btnSend" value="发送" /><br />
 聊天记录:<br />
 <ul id="ulMsg">
 </ul>
</body>
</html>

希望本文所述对大家的asp.net程序设计有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索asp.net
ServerPush
,以便于您获取更多的相关知识。

时间: 2024-10-28 11:17:21

ASP.NET中ServerPush用法实例分析_实用技巧的相关文章

ASP.NET中ServerPush用法实例分析

 本文实例讲述了ASP.NET中ServerPush用法.分享给大家供大家参考.具体分析如下: 什么是ServerPush,服务器向客户端"推送",其实就是"长连接" 只有浏览器请求服务器端,服务器端才给浏览器响应数据,不会主动向浏览器推送数据,这是一种安全考虑,也是提高服务器的性能考虑,如果服务器向浏览器主动推送数据,就要用到ServerPush等技术模拟实现. 举个例子: 通过两个页面互相发送消息实现,消息放到数据库. 1 2 3 4 5 6 7 8 9 10

ASP.NET中Cookie的用法实例分析_实用技巧

本文实例讲述了ASP.NET中Cookie的用法.分享给大家供大家参考.具体分析如下: Cookie的用法也和ASP中差不多.比如我们建立一个名为aspcn,值为飞刀的cookie HttpCookie cookie = new HttpCookie["aspcn"]; cookie.Value = "飞刀"; Response.AppendCookie(cookie); 我们取出Cookie值也很简单 HttpCookie cookie = Request.Coo

ASP.NET中Dictionary基本用法实例分析_实用技巧

本文实例讲述了ASP.NET中Dictionary基本用法.分享给大家供大家参考,具体如下: //Dictionary位于System.Collections.Generic命名空间之下 /* * 使用Dictionary之前必须引用System.Collections.Generic命名空间: * 使用Dictionary时必须声明其键和值的数据类型(可以为任意类型): */ //声明实例化Dictionary为dic System.Collections.Generic.Dictionary

ASP.NET中IsPostBack用法详解_实用技巧

本文针对ASP.NET中IsPostBack的用法进行了详细的说明,有助于读者更准确的掌握ASP.NET中IsPostBack的用法. 一.IsPostBack介绍: Page.IsPostBack是一个标志:当前请求是否第一次打开.调用方法为:Page.IsPostBack或者IsPostBack或者this.IsPostBack或者this.Page.IsPostBack,它们都等价. 1)当通过IE的地址栏等方式打开一个URL时是第一次打开, 当通过页面的提交按钮或能引起提交的按钮以POS

ASP.NET数据库缓存依赖实例分析_实用技巧

本文实例讲述了ASP.NET数据库缓存依赖,分享给大家供大家参考.具体如下: 一般在ASP.NET中,Cache类最酷的特点是它能根据各种依赖来良好的控制自己的行为.以文件为基础的依赖是最有用的,文件依赖项是通过使用 Cache.Insert 并提供引用文件的 CacheDependency 对象添加的 复制代码 代码如下: Cache.Insert("MyData", Source, new CacheDependency(Server.MapPath("authors.x

asp.net Checbox在GridView中的应用实例分析_实用技巧

本文实例讲述了asp.net Checbox在GridView中的应用方法.分享给大家供大家参考,具体如下: 先看效果图: 前台代码:样式自己定义哦! <div style="text-align: center; width: 80%"> <yxy:HkrGridView ID="tabGridView1" runat="server" AutoGenerateColumns="False" Width=&

asp.net StringBuilder的用法 实例代码_实用技巧

要实现上述效果 复制代码 代码如下: public static string ShowNewMsg() { string Pic1 = "images/yzdp-_15.gif"; string Pic2 = "images/yzdp-_18.gif"; string Pic3 = "images/yzdp-_20.gif"; string Pic4 = "images/yzdp-_22.gif"; string Pic5

ASP.NET MVC中的视图生成实例分析_实用技巧

本文实例分析了ASP.NET MVC中的视图生成过程.分享给大家供大家参考.具体如下: 在 ASP.NET MVC 中,我们将前端的呈现划分为三个独立的部分来实现,Controller 用来控制用户的操作,View 用来控制呈现的内容,Model 用来表示处理的数据. 从控制器到视图 通常,在 Controller 中,我们定义多个 Action ,每个 Action 的返回类型一般是 ActionResult,在 Action 处理的最后,我们返回对于视图的调用. 复制代码 代码如下: pub

ASP.NET中Application全局对象用法实例浅析_实用技巧

本文实例讲述了ASP.NET中Application全局对象用法.分享给大家供大家参考.具体如下: Application是应用全局对象,被全体共享.无论通过哪个页面操作Application,另一个页面都可以读取Application信息. 由于Application是共享的,操作之前先Lock,操作完成后UnLock. 在一个页面设置数据: Application.Lock(); Application.Set("address", "上海"); Applica