我试着做一个SSE的例子,就像在这个视频https://www.youtube.com/watch?v=rhCKCKD0KnA中一样
response.setContentType("text/event-stream");
response.setCharacterEncoding("UTF-8");
PrintWriter printWriter = null;
while(true) {
try {
double rnd = Math.random() * 10000;
printWriter = response.getWriter();
printWriter.print("Rnd: " + rnd);
response.flushBuffer();
Thread.sleep(5000);
}
catch(IOException | InterruptedException e) {
e.printStackTrace();
printWriter.close();
break;
}
}和客户端
window.onload = function () {
startButton.onclick = () => {
eventSource = new EventSource('http://localhost:8080/byteslounge-1/sse_test');
eventSource.onopen = () => {
displayTextArea.value += 'connected...' + '\n';
};
eventSource.onmessage = (message) => {
displayTextArea.value += message.data + '\n\n';
};
eventSource.onerror = () => {
displayTextArea.value += 'error occured...' + '\n';
};
startButton.disabled = true;
};
takeMsg.onclick = () => {
eventSource.onmessage = (message) => {
displayTextArea.value += message.data + '\n\n';
};
};
stopButton.onclick = () => {
eventSource.close();
startButton.disabled = false;
};
clearText.onclick = () => {
displayTextArea.value = '';
}
}连接正常,但无法接收onMessage中的任何数据。服务器/客户端上没有错误/警告。我使用的是FF 64位最新版本/JDK 1.8/Payara。
发布于 2018-05-18 03:51:22
我在你的代码中看不到任何明显的问题。但是,在使用Payara 5时,我建议使用JAX-RS SSE API,而不是自己在servlet中编码。
请参阅此处的示例和指南:http://ridingthecrest.com/blog/2017/02/22/jax-rs-2_1-new-feature-introduction.html
使用JAX-RS SSE的服务器端点的替代方案:
@Path("server-sent-events")
@Singleton
public class ServerSentEventsResource {
@GET
@Produces(MediaType.SERVER_SENT_EVENTS)
public void getMessageQueue(@Context SseEventSink eventSink, @Context Sse sse) {
while(true) {
try {
double rnd = Math.random() * 10000;
eventSink.send(sse.newEvent("custom-message"));
Thread.sleep(5000);
}
catch(IOException | InterruptedException e) {
e.printStackTrace();
printWriter.close();
break;
}
}
}
}还要使用通用SSE客户端测试服务器端点,例如,curl支持SSE,并在传入事件到来时打印它们。如果这是有效的,那么你的javascript客户端就会出错。
https://stackoverflow.com/questions/50361318
复制相似问题