2016-07-25 11 views
0

単純なJava Server Socket(PHPおよび/またはASP)ではなくServer Sent Events(SSE)を実装したいと考えています。Javaを使ってSimple SSE Serverを実装する方法は?

このサーバーは、ブラウザからの着信要求をリスンし、ハンドラスレッドを作成し、接続を閉じずに要求(ヘッダーを送信)に応答してから、ユーザー入力(System.in)を待ちます。メッセージをクライアントに転送します。

もちろん、私はJ2EEライブラリ(ジャージーなど)を使ってそのような作業をするだけで、余計になるでしょう。

ソースは以下の通りです:

import java.net.*; 
import java.io.*; 
import java.util.Scanner; 

public class Loc { 
public static void main (String[] args) throws IOException{ 
    ServerSocket ss = new ServerSocket(8888); 
    //listen to only one connection. 
    System.out.print("Waiting for connection..."); 

    Socket hp = ss.accept(); 
    System.out.println("Connected!"); 


    BufferedReader br = new BufferedReader(new InputStreamReader(hp.getInputStream()));  

    String line = ""; 
    while(br.ready() && (line=br.readLine()) != null) { //dumps request header. 
     System.out.println(line); 
    } 

    Thread handler = new Thread(new ClientHandler(hp)); 
    handler.start(); 
    try { 
     handler.join(); 
    }catch(InterruptedException e){ 

    } 
    System.out.println("Server stopped."); 
    } 
} 

class ClientHandler implements Runnable{ 

Socket toClient; 

public ClientHandler(Socket s){ 
    this.toClient = s; 
} 

public void run() { 
    try { 
     BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //server input (also forwards it to client) 
     BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(toClient.getOutputStream())); 

     // response header. 
     String response = "HTTP/1.1 200 OK\n"+ 
     "Server: Maknyos-Server/1.0\n"+ 
     "Cache-Control: no-cache,public\n"+ 
     "Content-Type: text/event-stream\n"+ 
     "Connection: keep-alive\n"+ 
     "Language: en-US\n"+ 
     "Charset: UTF-8\n"+ 
     "\n"; //two line break as header ending. 

     bw.write(response); 
     bw.flush(); 

     String input = ""; 
     while ((input = br.readLine()) != null) { //one directional message to client (browser), via cmd. 

      bw.write(input+'\n'); 
      bw.flush(); 
      if("close".equalsIgnoreCase(input)){ 
       break; 
      } 
     } 

     toClient.close(); 
    }catch(IOException e){ 
     System.out.println("IOEXception! "+e); 
    } 
    } 

これはクライアントです。

<h1>Hullo World!</h1> 
<script type="text/javascript"> 

    var es = new EventSource("http://localhost:8888"); 
    es.onmessage = function (event) { 
     alert(event.data); 
    }; 
</script> 

私はhtmlページを開くと、http要求ヘッダーがサーバーの標準出力(コマンドライン)に表示されます。 私のサーバーは、その後、私はそれらの2つのクライアントとサーバの間、私は何をして何の問題であると説明しようとするでしょう

HTTP/1.1 200 OK 
Server: Maknyos-Server/1.0 
Cache-Control: no-cache,public 
Content-Type: text/event-stream 
Connection: keep-alive 
Language: en-US 
Charset: UTF-8 


... 

でそれを返信。おそらくプロトコルに関連しているかもしれませんが、わかりません。

最初に、レスポンスヘッダを完成させるためにヘッダの最後に2行(改行)を付けると(上記の例のように)、Firefoxコンソールはブラウザがサーバに接続できないことを通知します。しかし、NETコンソールでは、応答要求を受信します。

第2に、レスポンスヘッダ(ダブル\ n文字なし)を終了することなくテストします。

どちらもSSEをブラウザに送信できませんでした。

編集すると、ブラウザのコンソールウィンドウが再び表示されるので、別のドメインにリクエストできないようです。

このプログラムは、ローカルホスト上で実行されます:私はあなたが春のブートを使用してアプリケーションを作成し、インスタンスを返しますコントローラを書く示唆80

+0

「サーバー送信イベント」へのリンクを含めることができますか?私はその用語になじみがなく、あなたが実際にやろうとしていることをよりよく理解したいと思います。 – markspace

+0

@markspace:SSEはW3標準の明確なトピックです。 OP:コードだけでなくペイロードを送る必要があります。 – dandavis

+0

@dandavisは、コードが示唆するように、標準入力を待つでしょう。しかし、ペイロード(例えば、 "data:hehehe \ n \ n"、または基本的にはsystem.inのもの)を送信するとすぐに、ブラウザは接続を閉じていました。これは私を困惑させるものです。 –

答えて

0

私のサーバーヘッダー文字列に重要なヘッダーが1つもないことが判明しました。

"Access-Control-Allow-Origin:*" + "\r\n" + ... 
関連する問題