我已经编写了一个基本的Java应用程序,使用Jersey SSE客户端来使用从Node.js服务器流式传输的SSE(服务器发送的事件)。但是,我无法收到这些事件。要验证的服务器组件工作正常,我用curl
如下:Jersey SSE客户端没有收到事件
curl -v -H "Accept: text/event-stream" http://localhost:8080/events/
我得到如下回应:
* Trying ::1...
* Connected to localhost (::1) port 8080 (#0)
> GET /events/ HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.43.0
> Accept: text/event-stream
>
< HTTP/1.1 200 OK
< X-Powered-By: Express
< Content-Type: text/event-stream
< Cache-Control: no-cache
< Connection: keep-alive
< Date: Wed, 26 Apr 2017 17:12:00 GMT
< Transfer-Encoding: chunked
<
event: ping
data: 0.6637400726922664
event: ping
data: 0.8538157046725585
在Java我SSE客户端的代码如下(Java的8,泽西岛客户端1.19.3,泽西媒介SSE 2.25.1):
import org.glassfish.jersey.media.sse.EventListener;
import org.glassfish.jersey.media.sse.EventSource;
import org.glassfish.jersey.media.sse.InboundEvent;
import org.glassfish.jersey.media.sse.SseFeature;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.WebTarget;
public class NodeCaptureSSE {
public static void main(String[] args) {
Client client = ClientBuilder.newBuilder().register(SseFeature.class).build();
WebTarget target = client.target("http://localhost:8080/events/");
EventSource eventSource = EventSource.target(target).build();
EventListener listener = new EventListener() {
@Override
public void onEvent(InboundEvent inboundEvent) {
System.out.println(inboundEvent.getName() + "; " + inboundEvent.readData(String.class));
}
};
eventSource.register(listener, "ping");
eventSource.open();
System.out.println("Connected to SSE source...");
try {
Thread.sleep(25_000);
}
catch (InterruptedException ie) {
System.err.println("Exception: " + ie.getMessage());
}
eventSource.close();
System.out.println("Closed connection to SSE source");
}
}
我在屏幕上看到的唯一输出是:
Connected to SSE source...
后面是25秒后的退出。由于服务器正在流式传输命名事件(“ping”),我指定在将侦听器注册到事件源时。省略第二个参数到eventSource.register(...);
没有做任何事情,但我没有想到。我还删除了网址中的结尾/
,但这会产生404 Not Found
(如预期的那样)。我希望能够朝正确的方向发展。
有没有办法让连接长时间打开?,泽西岛客户端会像浏览器一样工作吗? –