Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HTML5服务器在Tomcat7上发送事件Servlet,缓冲事件直到套接字关闭_Java_Html_Tomcat_Servlets - Fatal编程技术网

Java HTML5服务器在Tomcat7上发送事件Servlet,缓冲事件直到套接字关闭

Java HTML5服务器在Tomcat7上发送事件Servlet,缓冲事件直到套接字关闭,java,html,tomcat,servlets,Java,Html,Tomcat,Servlets,我正在尝试将服务器端事件servlet添加到我的web应用程序中。下面是我的servlet的代码:(几个不同的版本) 使用getOutputStream(): 只有当服务器关闭连接时,输出才会在末尾出现。如果servlet不关闭连接,则永远不会获得输出 我需要事件在服务器发送之后到达,而不是在连接关闭时到达。我做错了什么?这不是它应该工作的方式 我在谷歌上搜索并尝试了很多例子,他们都遇到了同样的问题 我尝试了许多不同版本的tomcat 7.0.67、7.0.34和7.0.62。我在Windows

我正在尝试将服务器端事件servlet添加到我的web应用程序中。下面是我的servlet的代码:(几个不同的版本)

使用getOutputStream():

只有当服务器关闭连接时,输出才会在末尾出现。如果servlet不关闭连接,则永远不会获得输出

我需要事件在服务器发送之后到达,而不是在连接关闭时到达。我做错了什么?这不是它应该工作的方式

我在谷歌上搜索并尝试了很多例子,他们都遇到了同样的问题

我尝试了许多不同版本的tomcat 7.0.67、7.0.34和7.0.62。我在Windows上使用64位版本的JDK 8.0.65,在Linux上使用JDK 8.0.45


有人用这个吗?我做错了什么?

我想出了解决办法。我切换到使用,它的功能如预期

我无法使上述解决方案正确运行。服务器缓冲所有IO,直到连接关闭。我尝试了各种刷新和操纵缓冲区大小

希望这有助于。。。从另一个框架开始,比如Jersey SSE

@WebServlet(urlPatterns = {"/hello"}, asyncSupported = true)
public class HelloServlet extends HttpServlet 
{
    private static final long serialVersionUID = 2889150327892593198L;
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    {
        response.setContentType("text/event-stream");   
        response.setHeader("Cache-Control", "no-cache");
        response.setHeader("Connection", "keep-alive");
        response.setCharacterEncoding("UTF-8");

        ServletOutputStream out = response.getOutputStream();

        try{
                for(int i=0; i<10; i++) {

                out.print("id: "+ i +"\n");
                out.print("data: "+ System.currentTimeMillis() +"\n\n");
                out.flush();
                response.flushBuffer();

                System.out.println("time sent:"+ System.currentTimeMillis());
                System.out.println("IsCommitted:" + response.isCommitted() );
                Thread.sleep(1000);
            }
        }
        catch(Exception e)  
        {
            e.printStackTrace();
        }
        out.close();    
    } 
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
    response.setContentType("text/event-stream");   
    response.setHeader("Cache-Control", "no-cache");
    response.setHeader("Connection", "keep-alive");
    response.setCharacterEncoding("UTF-8");

    PrintWriter writer = response.getWriter();

    try{
        for(int i=0; i<10; i++) {

            writer.write("id: "+ i +"\n");
            writer.write("data: "+ System.currentTimeMillis() +"\n\n");
            writer.flush();
            response.flushBuffer();

            System.out.println("time sent:"+ System.currentTimeMillis());
            System.out.println("IsCommitted:" + response.isCommitted() );

            Thread.sleep(1000);
        }
    }
    catch(Exception e)  
    {
        e.printStackTrace();
    }
    writer.close();

}
SseDispatcher dispatcher = null;

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
{
    System.out.println("test started.  Async mode.");
    startThread();
    dispatcher = new SseDispatcher(req).ok().open();
}

private void startThread() 
{
    Thread thread = new Thread() 
    { 
        @Override public void run() 
        {
            System.out.println("Thread started");
            try {
                for(int i=0; i<10; i++) 
                {
                    System.out.println("Sending message " + i);
                    onGivenEvent("message"+1, System.currentTimeMillis()+"" ) ;
                    Thread.sleep(1000);
                }
            } catch (Exception e) {

                e.printStackTrace();
            }

            dispatcher.close();
            System.out.println("Thread ending");
        }
    };

    thread.setDaemon(true);
    thread.setName("testsse");
    thread.start();
    System.out.println("Starting thread");
}

public void onGivenEvent(String eventName, String data) throws IOException 
{
    if( dispatcher != null)
    {
        dispatcher.send(eventName, data);
    }
}
curl -i -H "Accept: application/json"  -X GET http://localhost:8080/testsse/hello