2017-04-26 40 views
0

我已经编写了一个基本的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(如预期的那样)。我希望能够朝正确的方向发展。

回答

2

你的代码适合我。事实上,我正在拼命寻找这个代码,所以感谢^ _ ^哈哈哈。无论如何,我有一个SSE事件流输出时间事件,这里是我的输出看起来像你的代码(我改变ping时间事件附加到我的服务器)。

Connected to SSE source... 
time-event; Time is Thu Jul 20 10:10:37 CDT 2017 
time-event; Time is Thu Jul 20 10:10:41 CDT 2017 

问题是最有可能与您的事件流,您使用指向它,而不是与你的客户端Java代码的URL。我注意到的另一件事是,在你的curl命令中我没有看到那里的字符集规范。确保你的字符集设置为UTF-8。这是我的CMD输出的样子: enter image description here

这是我用来生成流的代码。

import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.xml.ws.http.HTTPException; 
import java.io.IOException; 
import java.io.PrintWriter; 
import java.net.PasswordAuthentication; 
import java.util.Calendar; 



    @SuppressWarnings("java.io.IOException") 
    @WebServlet("/SSEServlet") 
    public class SSEServlet extends HttpServlet { 
     private static final long serialVersionUID = 1L; 
     private boolean cancel; 

     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException { 

      System.out.println("You just entered the doGetMethod"); 
      response.setContentType("text/event-stream"); 
      response.setCharacterEncoding("UTF-8"); 
      PrintWriter printWriter = null; 
      response.getBufferSize(); 


      while(true){ 
       try{ 
        System.out.println("You just entered the while loop"); 
        double randomNumber = Math.random()*10000; 
        printWriter = response.getWriter(); 

        printWriter.print("event: time-event" + "\n"); 
        printWriter.print("data: " + "Time is " + Calendar.getInstance().getTime() + "\n\n"); 
        response.flushBuffer(); 
        Thread.sleep((long)randomNumber); 

       } catch (IOException | InterruptedException e){ 
        e.printStackTrace(); 
        break; 
       } 
      } 
      System.out.println("Connection was aborted"); 
     } 
    } 
+1

有没有办法让连接长时间打开?,泽西岛客户端会像浏览器一样工作吗? –

相关问题