最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

ASP.NET中ServerPush用法实例分析

来源:懂视网 责编:小采 时间:2020-11-27 22:38:32
文档

ASP.NET中ServerPush用法实例分析

ASP.NET中ServerPush用法实例分析:本文实例讲述了ASP.NET中ServerPush用法。分享给大家供大家参考。具体分析如下: 什么是ServerPush,服务器向客户端推送,其实就是长连接 只有浏览器请求服务器端,服务器端才给浏览器响应数据,不会主动向浏览器推送数据,这是一种安全考虑,也是提
推荐度:
导读ASP.NET中ServerPush用法实例分析:本文实例讲述了ASP.NET中ServerPush用法。分享给大家供大家参考。具体分析如下: 什么是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程序设计有所帮助。

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文档

ASP.NET中ServerPush用法实例分析

ASP.NET中ServerPush用法实例分析:本文实例讲述了ASP.NET中ServerPush用法。分享给大家供大家参考。具体分析如下: 什么是ServerPush,服务器向客户端推送,其实就是长连接 只有浏览器请求服务器端,服务器端才给浏览器响应数据,不会主动向浏览器推送数据,这是一种安全考虑,也是提
推荐度:
标签: 方法 使用 用法
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top