如何在totaljs中实现广播的服务器发送事件?

时间:2014-05-08 11:07:25

标签: javascript html5 node.js server-sent-events

假设我有这种情况:

  • Client1和client2以某种session1连接

  • 同时,client3和client4在session2中连接

现在我想播放活动" a"仅限session1中的所有客户端。

我发现了这个例子:

https://github.com/totaljs/examples/tree/master/server-sent-events

但我还没有找到如何实现我的目标。

请问任何想法?

1 个答案:

答案 0 :(得分:0)

对于这种情况,最好使用WebSocket。 Server-Sents事件(SSE)的答案:

<强>控制器/ default.js

var session1 = [];
var session2 = [];

exports.install = function() {
    F.route('/broadcast/{session}/', sse_broadcast, ['sse']);
};

function sse_broadcast(session) {

    var self = this;

    switch (session) {
        case '1':
            session1.push(self);
            return;
        case '2':
            session1.push(self);
            return;
    }

    self.throw400('This session is not supported.');
}

setInterval(function() {

    if (session1.length === 0)
        return;

    var message = U.GUID(20);
    var remove = -1;

    // broadcast all clients of session1
    for (var i = 0, length = session1.length; i < length; i++) {
        var session = session1[i];

        if (!session.isConnected) {
            remove = i;
            continue;
        }

        session.sse({ message: message });
    }

    if (remove === -1)
        return;

    session1[remove].destroy();
    session1.splice(remove, 1);

}, 1000);

<强>客户端:

<div id="message"></div>

<script type="text/javascript">

    function init() {
        var el = document.getElementById('message');
        var obj = new EventSource('/broadcast/1/');

        obj.onmessage = function(ev) {
            el.innerHTML = ev.data + '<br />' + el.innerHTML;
        };

        obj.addEventListener('end', function() {
            el.innerHTML = '----- end<br />' + el.innerHTML;
        }, true);

        obj.onerror = function(e) {
            el.innerHTML = '----- error<br />' + el.innerHTML;
        };
    }

    setTimeout(init, 500);
</script>