java - 寻找服务器发送事件规范客户端的 Java 实现。

标签 java server-sent-events

<分区>

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

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

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

最佳答案

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

 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 .

希望这对你有帮助,延斯

关于java - 寻找服务器发送事件规范客户端的 Java 实现。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15495591/

相关文章:

python - 服务器使用 Flask 和 Tornado 发送事件

JavaScript SSE 不适用于 Firefox

java - 集成测试 Spring SseEmitters

java - java中如何确定某个请求的优先级?

java - 如何重构重复的代码?

java - JSTL if 标签始终执行为 true

JavaScript、PHP - 对多个唯一用户使用服务器发送的事件?

java - 我的 Java Hashmap 实现存在问题

java - 如何为 OSGi 服务创建代理

javascript - 使用 Jest 和 ES 模块测试客户端 SSE