Java EE SSE聊天
我想做一个简单的聊天,连接到服务器的用户发送消息,其他用户接收消息 这是我的html:Java EE SSE聊天,java,jakarta-ee,server-sent-events,Java,Jakarta Ee,Server Sent Events,我想做一个简单的聊天,连接到服务器的用户发送消息,其他用户接收消息 这是我的html: <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <body> <script> function setupEventSource() { var output = document.get
<%@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>
有几件事我不明白:如果我不发送事件:close
浏览器会每3秒钟发送一次垃圾邮件,这是为什么?我试图通过关闭EventSource
来避免这种情况,但这是否正确?一旦EventSource关闭,您就不能像刚刚关闭一样打开它,对吗
我还希望所有“已连接的客户端”都能收到消息,但这并没有发生,数据:
不是应该发送给所有客户端吗
我试过使用chrome和firefox opend并发送消息,我注意到firefox的一些情况:在每次消息后我发送
事件:close
时,消息会每隔6秒发出一次垃圾邮件 您是否正在关闭servlet中的请求?服务器上的SSE请求需要以不同方式处理:
标准Servlet:
还有一点需要注意。如果您使用的是Servlet,您几乎肯定需要使用异步Servlet API,否则每个连接的客户端都会有一个开放线程。使用
Servlet
,您如何知道客户端已关闭EventSource连接?谢谢
// 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();