12

現在、SSEとWindowsXPに関連する問題が発生しています。以下のソースコードは、Windows XPのChromeを除いて、私が試したすべてのChromeで現在機能しています(?)理由はわかりません。これは、ユーザーがChromeを使用する必要があるコントロールパネルで使用することを目的としています。つまり、IEやFirefoxなどは気にしません。

問題:サーバー側のイベントはどこでも機能しますが(Chrome)、Windows XPでは機能しません(Chrome)。私がそれが機能すると言うとき、私はメッセージハンドラーが呼び出されることを意味します。

コード

  • Javascriptコード

    if (!!window.EventSource) {
       console.log("Event source available");
       var source = new EventSource('/admin/systemalert');
    
       source.addEventListener('message', function(e) {
            console.log(e.data);
       });
    
       source.addEventListener('open', function(e) {
            console.log("Connection was opened.");
       }, false);
    
       source.addEventListener('error', function(e) {
            if (e.readyState == EventSource.CLOSED) {
                console.log("Connection was closed.");
            } else {
                console.log(e.readyState);    <-- in windows XP it prints Error here
            }
       }, false);
    } else {
            console.log("No SSE available");
    }
    
  • サーバー側のコード

    @Controller
    @RequestMapping("/admin/**")
    public class AdminController {
    
            @RequestMapping("systemalert")
            public @ResponseBody String sendMessage(HttpServletResponse response) {
                    Random r = new Random();
                    response.setContentType("text/event-stream");
                    try {
                            Thread.sleep(10000);
                    } catch (InterruptedException e) {
                            e.printStackTrace();
                    }   
                    return "data:Testing 1,2,3" + r.nextInt() +"\n";
            }
    
    }
    

コードで述べられているように、行console.log(e.readyState); Windows XPでChromeを使用すると、「エラー」が出力されます。何か案は?誰かがソースコードに何か問題があると思いますか?

前もって感謝します。アグスティン

4

3 に答える 3

11

この問題を抱えている人にとって、問題はデータの後に必要な新しい行に関連していました。基本的に、私が使用していたように1行ではなく、2行が必要です。そうすれば、どこでも機能します。

これを変更する:

return "data:Testing 1,2,3" + r.nextInt() +"\n";

これに:

return "data:Testing 1,2,3" + r.nextInt() +"\n\n";

問題を修正します。

于 2012-04-10T17:00:45.510 に答える
5

手動でSSEを実装する代わりに、SpringFramework4.2以降はネイティブにSSEをサポートしていることに注意してください。SseEmitterを返すこのサンプルSSE対応コントローラーを参照してください。

于 2015-10-13T08:37:16.630 に答える
0

OK、PHP+HTML5で小さな例を作成しました。

ここでそれを見ることができます。2つの異なるボタンがあることがわかります。1つはイベントソースを作成し、もう1つはイベントソースを切断します。

コードはFirefox/Chromeコンソールに直接出力されます。ご覧のとおり、メッセージハンドラーはFirefoxで呼び出されますが、chromeでは呼び出されません。

これは、これまでにテストしたどのChromeでも機能しません。

Firefoxの出力例:

Creating event source
Open
Id: 1334072077
Message: Se puede leer esto?
Origin: http://arancione-consulting.com
Closed
Open
Id: 1334072082
Message: Se puede leer esto?
Origin: http://arancione-consulting.com
Closed

Chrome出力の例:

Creating event source
Open
Closed
Open
Closed

誰かが知りたい場合、サーバー側のコードは次のとおりです。

<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache'); // prevent caching of event data.
echo "id: " . time() . "\n";
echo "Event: time\n";
echo "data: Se puede leer esto?\n";
flush();
?>

何か案は?

于 2012-04-10T15:36:43.630 に答える