Java HTML5服务器在Tomcat7上发送事件Servlet,缓冲事件直到套接字关闭
我正在尝试将服务器端事件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.45Java 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
有人用这个吗?我做错了什么?我想出了解决办法。我切换到使用,它的功能如预期 我无法使上述解决方案正确运行。服务器缓冲所有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