服务器发送的事件:JavaScript 事件不工作
Server Sent Events: JavaScript events not working
我已经编写了一小段代码来生成服务器发送的事件和相应的 Java 脚本客户端来记录所有消息。当我发送请求时,我可以在 chrome 的网络选项卡中看到浏览器正在接收来自服务器的所有消息,但在 Java 脚本中仅触发打开事件侦听器并且永远不会触发消息侦听器。我在这上面花了很多时间但没有成功。
这是我的 Java 生成 SSE 的代码:
@GET
@Path("/updates/sse")
@Produces(MediaType.SERVER_SENT_EVENTS)
public void publishUpdates(@Context SseEventSink sseEventSink) {
new Thread(() -> {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
final OutboundSseEvent event = sse.newEventBuilder()
.name("message-to-client")
.data(String.class, "Hello world " + i + "!")
.build();
sseEventSink.send(event);
}
}).start();
}
这是我的Java处理响应的脚本代码:
if(typeof(EventSource) !== "undefined") {
var source = new EventSource("/gra/services/updates/sse");
source.addEventListener('message', function(e) {
console.log("message");
console.log(e.data);
}, false);
source.addEventListener('open', function(e) {
// Connection was opened.
console.log("open");
}, false);
source.addEventListener('error', function(e) {
console.log("error");
console.log(e);
if (e.readyState == EventSource.CLOSED) {
// Connection was closed.
}
}, false);
} else {
document.getElementById("result").innerHTML = "Sorry, your browser does not support server-sent events...";
}
这是我在 chrome 的控制台中得到的内容。只调用打开的侦听器:
这是我在 chrome 的“网络”选项卡中看到的内容:
我想弄清楚浏览器是否正在接收事件数据,为什么消息侦听器没有被调用。
查看 example in documentation for EventSource:
/* The event "message" is a special case, as it
* will capture events without an event field
* as well as events that have the specific type
* `event: message` It will not trigger on any
* other event type.
*/
sse.addEventListener("message", function(e) {
console.log(e.data)
})
您的消息类型是 message-to-client
,而不是 "nothing"。
我已经编写了一小段代码来生成服务器发送的事件和相应的 Java 脚本客户端来记录所有消息。当我发送请求时,我可以在 chrome 的网络选项卡中看到浏览器正在接收来自服务器的所有消息,但在 Java 脚本中仅触发打开事件侦听器并且永远不会触发消息侦听器。我在这上面花了很多时间但没有成功。
这是我的 Java 生成 SSE 的代码:
@GET
@Path("/updates/sse")
@Produces(MediaType.SERVER_SENT_EVENTS)
public void publishUpdates(@Context SseEventSink sseEventSink) {
new Thread(() -> {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
final OutboundSseEvent event = sse.newEventBuilder()
.name("message-to-client")
.data(String.class, "Hello world " + i + "!")
.build();
sseEventSink.send(event);
}
}).start();
}
这是我的Java处理响应的脚本代码:
if(typeof(EventSource) !== "undefined") {
var source = new EventSource("/gra/services/updates/sse");
source.addEventListener('message', function(e) {
console.log("message");
console.log(e.data);
}, false);
source.addEventListener('open', function(e) {
// Connection was opened.
console.log("open");
}, false);
source.addEventListener('error', function(e) {
console.log("error");
console.log(e);
if (e.readyState == EventSource.CLOSED) {
// Connection was closed.
}
}, false);
} else {
document.getElementById("result").innerHTML = "Sorry, your browser does not support server-sent events...";
}
这是我在 chrome 的控制台中得到的内容。只调用打开的侦听器:
这是我在 chrome 的“网络”选项卡中看到的内容:
我想弄清楚浏览器是否正在接收事件数据,为什么消息侦听器没有被调用。
查看 example in documentation for EventSource:
/* The event "message" is a special case, as it
* will capture events without an event field
* as well as events that have the specific type
* `event: message` It will not trigger on any
* other event type.
*/
sse.addEventListener("message", function(e) {
console.log(e.data)
})
您的消息类型是 message-to-client
,而不是 "nothing"。