博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Server push(服务器推送技术)
阅读量:5088 次
发布时间:2019-06-13

本文共 3136 字,大约阅读时间需要 10 分钟。

一.服务器推送技术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(从第一个开始,去两条数据)

五.实现部分:

 

    • 浏览器部分:

 

    ServerPush             我是:
发给: 说:

 

    •   服务器端为(一般处理程序(.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                    else17                    {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             else44             {45                 throw new Exception("action异常");46             }47         }

 

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

你可能感兴趣的文章
Android 网络请求框架Retrofit
查看>>
GeoServer手动发布本地Shapefile地图
查看>>
KMP之我见
查看>>
BZOJ1119[POI2009]SLO && BZOJ1697[Usaco2007 Feb]Cow Sorting牛排序
查看>>
Django组件——分页器和中间件
查看>>
scala 14 trait
查看>>
You need to run build with JDK or have tools.jar问题解决
查看>>
BZOJ 1030: [JSOI2007]文本生成器 [AC自动机 DP]
查看>>
HDU 3949 XOR [高斯消元XOR 线性基]
查看>>
for-each用法误区(不能改变数组元素值)
查看>>
f.select
查看>>
SSH2各部分作用
查看>>
不设置默认网关,导致traceroute无法获取途经路由信息原因
查看>>
MySql优化—删除操作
查看>>
三天打渔两天晒网
查看>>
python编码的那些事
查看>>
编程语言分类
查看>>
[转]GIT PUSH Error 403的解决方法
查看>>
Unity 移动主角的时候,鼠标被固定在屏幕中心而且被隐藏
查看>>
自已接触过的数据访问方式总结
查看>>