gpt4 book ai didi

Java Servlet 3.0 服务器推送 : Sending data multiple times using same AsyncContext

转载 作者:搜寻专家 更新时间:2023-11-01 01:44:10 34 4
gpt4 key购买 nike

以此处回答的几个示例和问题为主导(主要是 http://www.javaworld.com/javaworld/jw-02-2009/jw-02-servlet3.html?page=3 ),我想让服务器在不完成请求的情况下多次向客户端发送响应。当请求超时时,我会创建另一个,依此类推。

我想避免长轮询,因为每次收到响应时我都必须重新创建请求。 (这完全不是 servlet 3.0 的异步功能的目标)。

我在服务器端有这个:

@WebServlet(urlPatterns = {"/home"}, name = "async", asyncSupported = true) 

public class CometServlet extends HttpServlet {

public void doGet(final HttpServletRequest request, final HttpServletResponse response) throws IOException, ServletException {

AsyncContext ac = request.startAsync(request, response);

HashMap<String, AsyncContext> store = AppContext.getInstance().getStore();

store.put(request.getParameter("id"), ac);

}
}

还有一个写入异步上下文的线程。

class MyThread extends Thread {
String id, message;

public MyThread(String id, String message) {
this.id = id;
this.message = message;
}

public void run() {
HashMap<String, AsyncContext> store = AppContext.getInstance().getStore();
AsyncContext ac = store.get(id);
try {
ac.getResponse().getWriter().print(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}

但是当我发出请求时,仅当我调用 ac.complete() 时才会发送数据。没有它请求总是超时。所以基本上我想在请求完成之前“流式传输”数据。

请注意,我已经尝试使用 Jetty 8 Continuation API,我还尝试打印到 OutputStream 而不是 打印机。我还尝试了 flushBuffer() 响应。同样的事情。

我做错了什么?

客户端是这样完成的:

    var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://localhost:8080/home', true);
xhr.onreadystatechange = function () {
if (xhr.readyState == 3 || xhr.readyState == 4) {
document.getElementById("dynamicContent").innerHTML = xhr.responseText;
}
}
xhr.send(null);

至少有人可以确认服务器端没问题吗? :)

最佳答案

你的服务器端和客户端代码确实没问题。问题实际上是您的浏览器缓冲了来自网络服务器的 text/plain 响应。这就是您在使用 curl 时看不到此问题的原因。

我使用了你的客户端代码,我能够看到增量响应,只有一点点变化:

response.setContentType("text/html");

无论大小,增量响应都会立即显示。

如果没有该设置,当我的输出是一条小消息时,它会被视为文本/纯文本,不会立即显示在客户端。当我不断地向客户端添加越来越多的响应时,它会不断累积,直到缓冲区大小达到大约 1024 字节,然后整个内容都显示在客户端。然而,在那之后,小增量立即出现(不再累积)。

关于Java Servlet 3.0 服务器推送 : Sending data multiple times using same AsyncContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16788371/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com