gpt4 book ai didi

Java-EE SSE 聊天

转载 作者:行者123 更新时间:2023-12-02 04:47:16 30 4
gpt4 key购买 nike

我正在尝试进行简单的聊天,其中连接到服务器的用户发送消息,其他用户接收消息。

这是我的 html:

 <%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<body>
<script>
function setupEventSource() {
var output = document.getElementById("output");
if (typeof(EventSource) !== "undefined") {
var msg = document.getElementById("textID").value;
var source = new EventSource("TestServlet?msg=" + msg);
source.onmessage = function(event) {
output.innerHTML += event.data + "<br>";
};

source.addEventListener('close', function(event) {
alert("Source closed!");
source.close();
}, false);
} else {
output.innerHTML = "Sorry, Server-Sent Event is not supported in your browser";
}
return false;
}
</script>

<h2>Simple SSE Echo Demo</h2>
<div>
<input type="text" id="textID" name="message" value="Hello World">
<input type="button" id="sendID" value="Send" onclick="setupEventSource()"/>
</div>
<hr/>
<div id="output"></div>
</body>
</html>

还有 servlet processRequest 中的这个:

    // set content type
response.setContentType("text/event-stream");
response.setCharacterEncoding("UTF-8");

String msg = request.getParameter("msg");

PrintWriter writer = response.getWriter();

// send SSE
writer.write("data: " + msg + "\n\n");
writer.write("event: close\n");
writer.flush();

有几件事我不明白:如果我不发送 event: close 浏览器将继续每 3 秒发送一次垃圾邮件,这是为什么?我尝试通过关闭 EventSource 来避免这种情况,但这正确吗?一旦EventSource被关闭,你就不能像刚刚关闭一样打开它了,对吧?

我还希望所有“连接的客户端”都收到消息,但这并没有发生,data: 不是应该发送给所有客户端吗?

我尝试过打开 chrome 和 firefox 并发送消息,我注意到 firefox 的一些情况:尽管我在每条消息后发送了 event: close,但该消息仍会每 6 秒发送一次垃圾邮件。

最佳答案

您是否正在关闭 servlet 中的请求?服务器上的 SSE 请求需要进行不同的处理:

标准 Servlet:

  1. 来自客户端的请求
  2. 服务器创建响应
  3. 服务器将响应发送回客户端
  4. 服务器关闭连接

对于 SSE,典型流程略有不同。首先,您通常需要工作流程,即处理连接注册的 Servlet 工作流程,以及处理向注册监听器发送事件的事件工作流程。

Servlet 工作流程:

  1. 请求从客户端到达(类型为事件流)
  2. 服务器将连接缓存在内存中
  3. 服务器未关闭连接

Activity 工作流程:

  1. 发生某些事情会触发事件
  2. 服务器获取连接缓存
  3. 对于每个仍打开的连接,服务器都会写入事件

我的猜测是,当您收到事件流请求时,您正在写出当时的事件,然后关闭连接。这会触发客户端的 EventSource 认为它已断开连接或错误关闭,并在 3 秒后尝试重新注册到服务器,整个过程再次发生。

还有一点需要注意。如果您使用 servlet,您几乎肯定需要使用异步 servlet API,否则您将为每个连接的客户端提供一个开放线程。

关于Java-EE SSE 聊天,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29562295/

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