2011-06-24 19 views
12

、クライアントが使用して更新を受信できるように、Javaサーブレットを使用して、サーバー送信されたイベントを作成することは可能ですJavaのHTTPサーブレットを使用して動作するはずです。Javaサーブレットとサーバー送信されたイベント

+0

「サーバー送信イベント」のHTML5機能を探していますか? http://today.java.net/article/2010/03/31/html5-server-push-technologies-part-1 – Robert

+0

はい..イベントはJavaサーブレットを使用して作成する必要があります – Chris

+0

サーブレットは受信HTTPリクエスト。それらは接続を開いたままにするようには設計されていません。あなたはそれを行うことができますが、あなたがそうした場合、あなたのサーバはワーカースレッドから非常に速く実行されると仮定します。 – Robert

答えて

6

これはトリックです。

HTML

<!DOCTYPE html> 


<html> 
<body onload ="registerSSE()" > 
    <script> 

     function registerSSE() 
     { 
      alert('test 1'); 
      var source = new EventSource('http://frewper:8080/hello/sse'); 
      alert('Test2'); 
      source.onmessage=function(event) 
      { 
       document.getElementById("result").innerHTML+=event.data + "<br />"; 
      }; 

      /*source.addEventListener('server-time',function (e){ 
       alert('ea'); 
      },true);*/ 
     } 
    </script> 
    <output id ="result"></output> 

</body> 
</html> 

サーブレット:

import java.io.*; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 




public class sse extends HttpServlet 
{ 
public void doPost(HttpServletRequest request, HttpServletResponse response) 
{ 
    try 
    { 
     System.out.println("SSE Demo"); 
     response.setContentType("text/event-stream"); 

     PrintWriter pw = response.getWriter(); 
     int i=0; 
     while(true) 
     { 

      i++; 
      pw.write("event: server-time\n\n"); //take note of the 2 \n 's, also on the next line. 
      pw.write("data: "+ i + "\n\n"); 
      System.out.println("Data Sent!!!"+i); 
      if(i>10) 
      break; 
     } 
     pw.close(); 

    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 

public void doGet(HttpServletRequest request,HttpServletResponse response) 
{ 
    doPost(request,response); 
} 

} 
+1

Jettyを使ってJDK 1.6.0_25とChromeブラウザで試しましたが、うまくいきません。サーブレットが要求を取得し、「データ送信済み」というメッセージがコンソールに表示されますが、Webページには応答が表示されません。どのようなJDKのバージョンとブラウザを使用しましたか?私はこのすべてに新しい。 – DPD

+0

jdk 1.6.0_24を使用しました。これはTomcatを使用していました。また、ブラウザが「sse」をサポートしているかどうかを確認してください。好ましくはchromeまたはfirefoxの最新バージョンを使用してください。 – frewper

+0

"EventSourceの応答にUTF-8ではない文字セット(" iso-8859-1 ")があります。接続を中断しています。私はデフォルトのエンコーディングだと思います。 'response.setCharacterEncoding(" UTF-8 ");' – Bakudan

3

サーバー送信されたイベントは、HTML5の機能です。私たちは "HTML5"と言います。したがって、クライアント側の機能です。 長いサーバーはhttps respnseヘッダー「text/event-stream; charset = UTF-8」、「接続」、「キープアライブ」を設定でき、サーバーによってサポートされています。このようなヘッダーはJava Servletで設定できます。 Here you can find a step for step guide on SSE with servlet

0

私は非同期モードでプレーンなJavaサーブレット内に統合することができ、非常に簡単なライブラリを作成しているので、余分なサーバスレッドは、各クライアントのために必要ありません:https://github.com/mariomac/jeasse

それはのためのポイント・ツー(SseDispatcherを統合ポイントSSE)とSseBroadcaster(イベント放送用)。使用例:

public class TestServlet extends HttpServlet { 

SseBroadcaster broadcaster = new SseBroadcaster(); 

@Override 
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    Scanner scanner = new Scanner(req.getInputStream()); 
    StringBuilder sb = new StringBuilder(); 
    while(scanner.hasNextLine()) { 
     sb.append(scanner.nextLine()); 
    } 
    System.out.println("sb = " + sb); 
    broadcaster.broadcast("message",sb.toString()); 
} 

//http://cjihrig.com/blog/the-server-side-of-server-sent-events/ 
@Override 
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    broadcaster.addListener(req); 
} 
} 
+0

興味深いですね。しかし、なぜそれをLGPL(Apache 2の代わりに)ライセンスしましたか? –

+0

@TomFennelly私は基本的に、派生コードに制限なしに自由に使用できるライセンスを「ランダムに」選択しました。あなたは別のものを使うように私に勧めますか? LGPLに不利な点はありますか? – Mario

+0

ビジネスに優しいという点では、Apache 2は、製品の中でそれを使用する人々の所在地が制限されているという点でウィルスではありません。 –

関連する問題