2

イベントをストリーミングする CGI スクリプトがあります。

#!/usr/bin/python
...
print 'Content-Type: text/event-stream\n'

while (True):
    delay()
    print 'event: item'
    print 'data: ' + get_random_event()
    print ''

コマンド ラインから、ランダムな間隔 (数秒ごと) でランダムなイベントを送信します。

ただし、次の JavaScript があります。

var source = new EventSource('feed.cgi');

source.addEventListener('message', function(current_event)
    {
    alert(current_event.data);
    }, false);

これは私に警告を発したことはありません。Chrome JavaScript コンソールにエラーはありませんが、これまでのところ、サーバー スクリプトをリッスンしているコードがイベントを受け取ったことを識別できる認識を得たことはありません。

これらを入手する方法についての提案はありますか?

- 編集 -

おそらく最初の CGI スクリプトを完成させるべきです。FireFox は、「Firefox は http://[deleted]/feed.cgi でサーバーへの接続を確立できません」と表示します。しかし、兄弟ディレクトリにあるCGIスクリプトを通常どおり実行できます.Apacheの最も細かいディレクトリ設定は、両方の親であり、.cgi拡張子を持つスクリプトをCGIとして実行できるようにするためのディレクトリにあります. また、スクリプトはモード 0755 に設定されています。

動作のインクリメントの後にファイル フラッシュを追加しても、スクリプトの受信は変わらないようです。

#!/usr/bin/python

import random
import sys
import time

timescale = 5

names = [
    'Adam',
    'Bob',
    'Carol',
    'David',
    'Eddie',
    'Frank',
    'George',
    'Harry',
    'Ike',
    'Jim',
    'Kenny',
    'Larry',
    'Mary',
    'Nancy',
    'Oliver',
    'Peter',
    'Quincy',
    'Roger',
    'Sam',
    'Thomas',
    'Uncle',
    'Vincent',
    'William',
    'Xavier',
    'Yogi',
    'Zachary',
    ]

notifications = [
    'applied for a position at ACME.',
    'went to an interview at ACME.',
    'accepted an offer from ACME.',
    ]

def delay():
    time.sleep((random.random() + random.random()) * timescale)

def get_random_event():
    result = '<div class="activity"><span class="name">'
    result += random.choice(names)
    result += '</span> '
    result += random.choice(notifications)
    result += '</div>'
    return result

print 'Content-Type: text/event-stream\n'

while (True):
    print 'event: item'
    print 'data: ' + get_random_event()
    print ''
    sys.stderr.flush()
    delay()
4

1 に答える 1

0

私たちのコードとW3chools Server Sent Event のドキュメントから始めて、chomium と firefox でこれらの変更 (lighttpd を使用) で正常に実行される例を作成します。

  1. 印刷の最後に '\n' を追加
  2. 標準エラーの代わりに標準出力をフラッシュする

したがって、その間は次のようになります。

while (True):
    print 'event: item' + '\n'
    print 'data: ' + get_random_event() + '\n'
    print ''
    sys.stdout.flush()
    delay()
于 2012-12-03T16:11:39.547 に答える