HTML5事件源API和node.js | 如何发送stream到正确的客户端?

出于某种原因,我认为没有必要提及,我不能使用socket.io,并决定使用HTML5事件源API(服务器发送的事件)向客户端发送消息。 该消息告诉客户他的付款已通过第三方回叫收到。

我有一个ID来标识每个客户端,并在callback中收到。 到目前为止,我有两个问题:

  1. 我想每个发送的消息都被广播给所有的客户端。 有没有办法通过他的IDselect一个特定的客户端?

    目前我在客户端使用if语句实现这个function,但是如果我可以直接从服务器发送消息给客户端来提高性能会很棒

  2. 当我closures客户端上的连接时,我想我并没有closures所有的连接,不是吗?

我的代码:

Node.js的

app.get('/payments', function(req, res) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "X-Requested-With"); res.writeHead(200, { 'Content-Type': 'text/event-stream', 'Connection': 'keep-alive', 'Cache-Control': 'no-cache', }); ee.on("payment", function (data) { res.write("data: " + JSON.stringify({'wallet': data.address, 'refund_address': data.refund_address,'payment_status': 'paid'}) + "\n\n" ); }); }); 

客户

  var source = new EventSource("/payments"); source.addEventListener('message', function(e) { if (e.origin == 'http://localhost:3000') { var data = JSON.parse(e.data); if (btcwalletdir == data.wallet) { //each client filter // do whatever here source.close(); } return; } }, false); 

这是生产环境的有效解决scheme吗?

问候,

关于EventSource,每个客户端都有自己的连接。 每次有人访问该端点时,都会分配一个请求/响应,因此当您执行res.write您只能写入一个客户端。

但是,当然,如果您向每个连接广播“支付”事件,则每个连接都会将json消息发送给相应的客户端。 因此,您需要find一种方法,只将数据发送到正确的连接(例如,将用户/连接ID添加到您发出的数据并将res对象存储在数组/对象中)

Interesting Posts