8

我有一个桌面客户端和一个服务器端都用 Java 实现。服务器端位于 Tomcat 上。

现在我希望使用服务器发送事件进行检查,虽然 Tomcat 可以在服务器上使用它,但我不知道如何从它的客户端执行它。所有实现都使用 Javascript,如果您的客户端是 Javascript 客户端,这很好。我的不是。

所以,我的问题是——SSE 规范的客户端是否有任何 Java 实现?

4

1 回答 1

6

我遇到了同样的问题并找到了解决方案。Jersey 有一个 SSE 客户端(它不是标准发行版的一部分,您还需要 jersey-media-sse jar,您可以在 Maven 存储库中找到它。

 public static void consumeEventStream(String url, Consumer consumer) throws Exception {
    Client client = ClientBuilder.newBuilder().register(new SseFeature()).build();
    WebTarget target = client.target(url);
    EventInput e = null;
    while (true) {
        Thread.sleep(1000);
        if (e==null || e.isClosed()) {
            // (re)connect
            e = target.request().get(EventInput.class);

            e.setChunkType("text/event-stream");
        }

        final InboundEvent inboundEvent = e.read();
        if (inboundEvent == null) {  
            break;
        }
        else {
           String data = inboundEvent.getData();
           // do something here - notify observers, parse json etc
        }

    }
    System.out.println("connection closed");
}

setChunkType 的调用是为了处理 Jersey 中的一个错误——如果 char 编码是内容类型的一部分,则 jersey 将无法识别事件类型。另一方面,规范和浏览器期望设置内容类型。会计。对 jira 来说,这已经解决了,但在最新版本的 jersey-media-sse-2.2.jar 中肯定还没有工作,另见https://java.net/jira/browse/JERSEY-2062

希望这会有所帮助,詹斯

于 2013-09-30T02:02:02.777 回答