ASP.NET中ServerPush用法实例分析
程序员文章站
2024-02-20 17:26:58
本文实例讲述了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程序设计有所帮助。