寻找一个Java实现的服务器发送事件规范(Server Sent Events)客户端。

9

我有一个桌面客户端和一个服务器端,两者都是用Java实现的。服务器端运行在Tomcat上。

现在我想使用Server Sent Events进行检查,尽管Tomcat可以在服务器端使用它,但我不知道如何从客户端使用它。所有的实现都使用JavaScript,如果您的客户端是JavaScript客户端,则没有问题。我的客户端不是JavaScript客户端。

那么,我的问题是 - 有没有Java实现SSE规范的客户端端?


你对这个有什么想法吗?Jersey的SSE对你来说工作正常吗?你能帮我一下吗?https://dev59.com/eH_aa4cB1Zd3GeqP67Yg - Sadanand
抱歉在这里问问题,但是我的问题(https://stackoverflow.com/questions/55239121/server-sent-events-with-tomee-7)没有得到回答。你是如何使Tomcat成为SSE主服务器的? - Frank Neblung
Java对我来说已经是古代历史了。过去6年中没有编写过Java代码。 - mark
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中的一个bug - 如果字符编码是内容类型的一部分,Jersey将无法识别事件类型。另一方面,规范和浏览器期望设置内容类型。 根据Jira的说法,这个问题已经得到解决,但在最新版本的jersey-media-sse-2.2.jar中尚未生效,详见https://java.net/jira/browse/JERSEY-2062。 希望这可以帮助您,Jens

请检查我上面的评论。 - Sadanand
Jersey还有一个EventSource类,可以隐藏一些内部细节以及异步处理:https://jersey.java.net/documentation/latest/sse.html#d0e11876 - mikemachado

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接