zoukankan      html  css  js  c++  java
  • Java SSE 服务器推送WEB页面接收数据


    //服务器代码
    package com.xy.inuyasha.web.controller;

    import javax.servlet.AsyncContext;
    import javax.servlet.AsyncEvent;
    import javax.servlet.AsyncListener;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Date;

    /**
    * Created by Administrator on 2017/3/15.
    */
    @WebServlet(urlPatterns = { "/role_echo" }, asyncSupported = true)
    public class SseTest extends HttpServlet {

    private static final long serialVersionUID = 1L;
    private final static int DEFAULT_TIME_OUT = 10 * 60 * 1000;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    // TODO Auto-generated method stub
    resp.setContentType("text/event-stream");
    resp.setCharacterEncoding("UTF-8");
    req.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true);//注意这里

    AsyncContext actx = req.startAsync(req, resp);
    actx.setTimeout(DEFAULT_TIME_OUT);
    actx.addListener(new AsyncListener() {
    @Override
    public void onComplete(AsyncEvent arg0) throws IOException {
    // TODO Auto-generated method stub
    System.out.println("[echo]event complete:" + arg0.getSuppliedRequest().getRemoteAddr());
    }

    @Override
    public void onError(AsyncEvent arg0) throws IOException {
    // TODO Auto-generated method stub
    System.out.println("[echo]event has error");
    }

    @Override
    public void onStartAsync(AsyncEvent arg0) throws IOException {
    // TODO Auto-generated method stub
    System.out.println("[echo]event start:" + arg0.getSuppliedRequest().getRemoteAddr());
    }

    @Override
    public void onTimeout(AsyncEvent arg0) throws IOException {
    // TODO Auto-generated method stub
    System.out.println("[echo]event time lost");
    }
    });
    new Thread(new AsyncWebService(actx)).start();
    }
    }

    class AsyncWebService implements Runnable {
    AsyncContext ctx;

    public AsyncWebService(AsyncContext ctx) {
    this.ctx = ctx;
    }

    public void run() {
    try {
    //等待十秒钟,以模拟业务方法的执行
    Thread.sleep(10000);
    PrintWriter out = ctx.getResponse().getWriter();
    out.println("data:中文" + new Date() + " "); //js页面EventSource接收数据格式:data:数据 + " "

    out.flush();
                ctx.complete();
    } catch (Exception e) {
    e.printStackTrace();
    }

    }

    }
    //jsp页面js脚本
    if (!!window.EventSource) { //EventSource是SSE的客户端.此时说明浏览器支持EventSource对象
    var source = new EventSource('/role_echo');//发送消息
        s = '';

    source.addEventListener('message', function(e) {
          
    s += e.data + "<br/>";
    $("#msgFromPush").html(s);
    },false);//添加客户端的监听

    source.addEventListener('open', function(e) {
    console.log("连接打开");
    }, false);

    source.addEventListener('error',function(e){
    if(e.currentTarget.readyState==EventSource.CLOSED){
    console.log("连接关闭");
    }else{
    console.log(e.currentTarget.readyState);
    }
    });
    }else{
    console.log("您的浏览器不支持SSE");
    }

    测试能跑通!!


  • 相关阅读:
    深入浅出理解Javascript原型概念以及继承机制(转)
    表达式计算器的实现
    C#中使用Oracle存储过程返回结果集
    基于.Net的单点登录(SSO)解决方案
    让Windows Server 2008 + IIS 7+ ASP.NET 支持10万并发请求
    项目经理应该把30%的时间用在编程上(转)
    我是如何打败拖延症的(转)
    我不是个内向的程序员,我只是很忙(转)
    这个项目要多久开发完成?(转)
    从零开始编写自己的C#框架(3)——开发规范(转)
  • 原文地址:https://www.cnblogs.com/shown/p/6554477.html
Copyright © 2011-2022 走看看