NodeJS:使用SSE发送图像文件

问题描述 投票:0回答:1

我在服务器端有一个 png 文件,它由 python 脚本每秒更新一次。我想使用 SSE 将其流式传输到客户端,以便它随着文件更新而更新。

服务器.js:

const express = require('express')
const fs = require('fs')

const app = express()
app.use(express.static('public'))

app.get('/countdown', function(req, res) {
  res.writeHead(200, {
    'Content-Type': 'iimage/png;base64',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive'
  })
  
  update(res);
})

function update(res) {
    const file = base64_encode("./public/pics/out.png");
    res.write(file);

    while (true) {
       
        wait(200);
        update(res);
    }
}

app.listen(3000, () => console.log('SSE app listening on port 3000!'))

function wait(ms){
    var start = new Date().getTime();
    var end = start;
    while(end < start + ms) {
      end = new Date().getTime();
   }
 }

 function base64_encode(file) {
    // read binary data
    var bitmap = fs.readFileSync(file);
    // convert binary data to base64 encoded string
    return new Buffer(bitmap).toString('base64');
}

index.html:

<html>
<head>
  <script>
  if (!!window.EventSource) {
    var source = new EventSource('/countdown')

    source.addEventListener('message', function(e) {
        var image = document.getElementsByClassName("img");
        image.src = "data:image/png;base64," + image;
    }, false)

  } else {
    console.log("Your browser doesn't support SSE")
  }
  </script>
<img id="img" src=""/>
</html>

我研究了如何做到这一点并尝试了这个,但它没有任何错误地工作。我可以修改什么才能使其正常工作?

node.js server-sent-events
1个回答
0
投票

您的客户端代码中存在一些错误。

  1. Document 接口的

    document.getElementsByClassName
    方法返回具有所有给定类名的所有子元素的
    array-like
    对象。

  2. 您应该使用

    event.data
    来获取图像数据。

if (!!window.EventSource) {
  // change to `document.getElementById` ✅
  const image = document.getElementById("img");
  const source = new EventSource('/countdown');
  source.addEventListener('message', (event) => {
    // get the event's data ✅
    const data = event.data;
    image.src = `data:image/png;base64,${data}`;
  }, false)

} else {
  console.log("Your browser doesn't support SSE")
}

参考

https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementsByClassName

https://developer.mozilla.org/en-US/docs/Web/API/EventSource

© www.soinside.com 2019 - 2024. All rights reserved.