2017-04-26 3 views
0

저지 SSE 클라이언트를 사용하여 Node.js 서버에서 스트리밍 된 SSE (서버 전송 이벤트)를 소비하기위한 기본적인 Java 응용 프로그램을 작성했습니다. 그러나 이벤트를 수신 할 수 없습니다. (저지 SSE 클라이언트가 이벤트를 수신하지 않습니다.

* 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 

자바 내 SSE 클라이언트 코드는 다음과 같다 자바 : 나는 다음과 같은 응답을 얻을

curl -v -H "Accept: text/event-stream" http://localhost:8080/events/ 

을 예상대로 다음과 같이 서버 구성 요소, 내가 curl을 사용 작동하는지 확인하려면 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(...);에 두 번째 매개 변수를 생략하면 아무 것도하지 않았지만 기대하지는 못했습니다. 또한 URL에서 / 결말을 제거했지만 예상대로 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에서 발생할 가능성이 큽니다. 내가 알아 차 렸던 또 하나의 문제는 컬 세트 명령에서 charset 스펙이 보이지 않는다는 것입니다. charset이 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

오랜 시간 동안 연결을 유지하는 방법이 있습니까?, 저지 sse 클라이언트는 브라우저처럼 작동합니까? –