反向Ajax(轮询)

来源:互联网 发布:macbookair怎样装软件 编辑:程序博客网 时间:2024/06/09 21:26

反向Ajax(轮询):
客户端设置好一定的时间间隔,每次发送请求给服务器端,服务器端专门为这个客户端启动一个线程并专门处理该请求并对客户端进行回复处理。
模拟场景:
(间隔2秒,以个人动态为例,关注评论后页面局部更新出数字提示客户有动态更新)
客户端:个人动态是否有变化?
服务器端:没变化
客户端:个人动态是否有变化?
服务器端:没变化

客户端:个人动态是否有变化?
服务器端:有一个人关注你(页面显示图标提示用户)


通过这个案例其实可以发现,这样的轮询对服务器的负载是很重的。所以在用AJax的的时候需要对性能问题考虑到位。


反向Ajax的实现:
1、如果要想支持反向Ajax 的操作处理,那么首先必须要将Servlet 添加为支持反向Ajax。

@WebServlet(urlPatterns="/message",asyncSupported=true)public class MessageServlet extends HttpServlet {}

2、 反向Ajax 实现处理的关键在于线程,也就是说用户的所有请求会使用doGet()或者是doPost()来处理,但是如果要想进行操作,则必须将每一个用户的请求封装为一个独立的线程类,随后启动该线程,而以后用户的推送处理将由此线程负责。
但是如果要想实现这种子线程的控制需要一个类的支持:javax.servlet.AsyncContext,此操作可以进行如下处理:
①取得当前的Request 对象:public ServletRequest getRequest();
②每一个线程可以单独回应:public ServletResponse getResponse();
③当前的线程对于本次的轮询操作完成:public void complete()。

class MessageThread implements Runnable {    private AsyncContext asc ;    public MessageThread(AsyncContext asc) {        this.asc = asc ; // 轮询的接口}    @Override    public void run() { // 可以进行数据库读取,或者其它消息组件读取        String msg = this.asc.getRequest().getParameter("msg") ;        try {            this.asc.getResponse().getWriter().println("ECHO : " + msg) ;            this.asc.complete();// 告诉客户端,本次的输出完毕了        } catch (Exception e) {            e.printStackTrace();        }    }}

3、 如果要想启动这个线程的操作,那么就必须依靠request 对象。
取得AsyncContext 接口对象:public AsyncContext startAsync() throws IllegalStateException;

@SuppressWarnings("serial")@WebServlet(urlPatterns="/message",asyncSupported=true)public class MessageServlet extends HttpServlet {    class MessageThread implements Runnable {        private AsyncContext asc ;        public MessageThread(AsyncContext asc) {            this.asc = asc ; // 轮询的接口        }        @Override        public void run() { // 可以进行数据库读取,或者其它消息组件读取            String msg = this.asc.getRequest().getParameter("msg") ;            try {                this.asc.getResponse().getWriter().println("ECHO : " + msg) ;                this.asc.complete();// 告诉客户端,本次的输出完毕了            } catch (Exception e) {                e.printStackTrace();            }        }    }    @Override    protected void doGet(HttpServletRequest request,HttpServletResponse response) throwsServletException, IOException {        request.setCharacterEncoding("UTF-8");        response.setCharacterEncoding("UTF-8");        AsyncContext asc = request.startAsync() ; // 准备启动一个反向Ajax线程对象        asc.start(new MessageThread(asc)); // 启动了一个新的线程    }    @Override    protected void doPost(HttpServletRequest request,HttpServletResponse response) throwsServletException, IOException {        this.doGet(request, response);    }}

4、 在页面使用反向Ajax 进行轮询处理;

<!DOCTYPE html><html><head>    <meta charset="UTF-8">    <title>Echo.htm(静态页面)</title>    <script type="text/javascript">        var xmlHttpRequest ; // 这个是Ajax主要的处理对象        function create() { // 该函数的主要功能是创建XmlHttpRequest对象            if (window.XMLHttpRequest) { // 当前浏览器不是IE                xmlHttpRequest = new XMLHttpRequest() ; // 直接创建对象            } else { // 如果是IE则需要通过ActiveX进行对象创建                xmlHttpRequest = new ActiveXObject("Microsoft.XMLHttp") ;            }        }        window.onload = function() {            loadMessage("www.mldnjava.cn") ;        }        function loadMessage(msg) {            create() ;            xmlHttpRequest.open("post","message?msg=" + msg) ; // 地址重写            xmlHttpRequest.send(null) ; // 表示发送请求            xmlHttpRequest.onreadystatechange = function() {            if (xmlHttpRequest.readyState == 4 && xmlHttpRequest.status == 200) {                document.getElementById("showDiv").innerHTML += "<p>" +xmlHttpRequest.responseText + "</p>" ;                window.setTimeout(function(){                    loadMessage("www.mldn.cn") ;                },2000) ;            }        }    }    </script></head><body>    <div id="showDiv"></div></body></html>
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微信提示绑定银行卡次数超限怎么办 手机卡太久没用被注销了怎么办 电信宽带欠费缴费后上不了网怎么办 电信宽带欠费后缴费连不上网怎么办 电脑开不了机屏亮但不开机怎么办 手机信息探探链接点开了怎么办 买的钻戒的票丢掉了怎么办 如果我过户了原来的积分怎么办? 英雄联盟安装到了一半卡住了怎么办 微信登录不上怎么办一直在转圈 lol老是忘了放装备技能怎么办 英雄联盟屏幕出现红框锁定了怎么办 钢三开局修改对电脑有用怎么办 我的世界为什么一直黑屏闪退怎么办 苹果6plus玩游戏闪退怎么办 电脑重置开机黑屏了怎么办才好? 龟头有一小块和鱼鳞一样脱皮怎么办 海盗来了赠送碎片密码忘了怎么办 王者荣耀还差几百金币买英雄怎么办 英雄联盟更新后画面突然很卡怎么办 苹果手机微信登陆没反应怎么办 谷歌商店注册短信一直验证怎么办 英雄联盟开游戏退出来进不去怎么办 忘记了路由器和网关的密码怎么办 逆战无尽塔防71关没怪了怎么办 看香的师傅要钱特别多怎么办 电商企业有收入支出没发票怎么办 洗衣液没稀释把衣服染褪色了怎么办 衣服被洗衣液洗褪色了怎么办 b站不小心点了差评怎么办 c盘文件目录损坏且无法读取怎么办 打印发票时发票上的字体变大怎么办 淘宝店铺食品违法遇到打假人怎么办 搜狗输入法说我没有权限安装怎么办 申请移民美国期间护照到期了怎么办 自己申请的qq号账号忘了怎么办 苹果手机下完游戏找不到在哪怎么办 苹果四下游戏的密码忘了怎么办 qq斗地主老自动发消息怎么办 微信小程序斗地主被限制了怎么办 台式电脑玩斗地主总黑屏怎么办