2017-04-26 19 views
0

Jersey SSEクライアントを使用して、Node.jsサーバーからSSE(サーバー送信イベント)をストリーミングするための初歩的なJavaアプリケーションを作成しました。しかし、私はイベントを受け取ることができません。次のように予想されるように、サーバー・コンポーネントが動作していることを確認するために、私は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(...);に2番目のパラメータを省略すると、私はそれを期待していませんでしたが、何もしませんでした。 URL内の/も削除しましたが、期待通りに404 Not Foundになります。正しい方向に指針を得ることを願っています。

答えて

2

コードは正常に機能しました。実際に私はこのコードのために必死に見ていたので、ありがとう^ _^haha​​ha。とにかく、私は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の仕様がないことです。文字セットが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

Jersey sse clientはブラウザのように動作しますか?長い間接続を開いたままにする方法はありますか? –

関連する問題