programing

Node.js를 사용한 데이터 스트리밍

css3 2023. 3. 31. 22:34

Node.js를 사용한 데이터 스트리밍

Node.js를 사용하여 서버에서 클라이언트로 데이터를 스트리밍할 수 있는지 알고 싶습니다.단일 AJAX 요청을 Node.js에 게시한 후 연결을 열어두고 클라이언트에 데이터를 지속적으로 스트리밍하고 싶습니다.클라이언트는 이 스트림을 수신하고 페이지를 계속 업데이트합니다.

업데이트:

답변에 대한 업데이트로서 - 이 작업이 제대로 수행되지 않습니다.response.write를 호출하기 전에 전송되지 않습니다.close이를 위해 사용하는 예제 프로그램을 설정했습니다.

Node.js:

var sys = require('sys'), 
http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    var currentTime = new Date();
    setInterval(function(){
        res.write(
            currentTime.getHours()
            + ':' + 
            currentTime.getMinutes()
            + ':' +
            currentTime.getSeconds()
        );
    },1000);
}).listen(8000);

HTML:

<html>
    <head>
        <title>Testnode</title>
    </head>

    <body>
        <!-- This fields needs to be updated -->
        Server time: <span id="time">&nbsp;</span>

        <!-- import jQuery from google -->
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>

        <!-- import jQuery -->
        <script type="text/javascript">
            $(document).ready(function(){
            // I call here node.localhost nginx ports this to port 8000
                $('#time').load('http://node.localhost');
            });
        </script>
    </body>
</html>

이 방법을 사용하면 전화할 때까지 아무것도 반환되지 않습니다.close()이것이 가능한가요?아니면 로드 함수를 다시 호출하는 대신 롱 폴링 방식을 사용해야 하나요?

가능하다.반응만 사용하세요.write()를 여러 번 사용합니다.

var body = ["hello world", "early morning", "richard stallman", "chunky bacon"];
// send headers
response.writeHead(200, {
  "Content-Type": "text/plain"
});

// send data in chunks
for (piece in body) {
    response.write(body[piece], "ascii");
}

// close connection
response.end();

30초마다 연결을 닫았다가 다시 열어야 할 수 있습니다.

EDIT: 실제로 테스트한 코드는 다음과 같습니다.

var sys = require('sys'),
http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    var currentTime = new Date();
    sys.puts('Starting sending time');
    setInterval(function(){
        res.write(
            currentTime.getHours()
            + ':' +
            currentTime.getMinutes()
            + ':' +
            currentTime.getSeconds() + "\n"
        );

        setTimeout(function() {
            res.end();
        }, 10000);

    },1000);
}).listen(8090, '192.168.175.128');

Telnet으로 접속하면 확실히 청크한 응답이 나옵니다.그러나 AJAX 브라우저에서 사용하려면 XHR.readyState = 3(오디오 응답)을 지원해야 합니다.제가 알기로는 모든 브라우저가 이 기능을 지원하는 것은 아닙니다.따라서 긴 폴링(또는 Chrome/Firefox의 경우 웹소켓)을 사용하는 것이 좋습니다.

EDIT2: 또한 nginx를 Node 역프록시로 사용하는 경우 Node는 모든 청크를 수집하여 사용자에게 한 번에 전송하려고 할 수 있습니다.수정해야 돼요.

Sockets.io 를 참조해 주세요.HTTP/HTTPS 스트리밍을 제공하고 이를 위해 다양한 트랜스포트를 사용합니다.

  • 웹 소켓
  • Web Socket over Flash (+ XML 보안 정책 지원)
  • XHR 폴링
  • XHR 멀티파트 스트리밍
  • 영원 Iframe
  • JSONP 폴링(크로스 도메인용)

그리고! Node와 심리스하게 연동됩니다.JS. 이것도 NPM 패키지입니다.

https://github.com/LearnBoost/Socket.IO

https://github.com/LearnBoost/Socket.IO-node

무한 루프를 중단할 수도 있습니다.

app.get('/sse/events', function(req, res) {
    res.header('Content-Type', 'text/event-stream');

    var interval_id = setInterval(function() {
        res.write("some data");
    }, 50);

    req.socket.on('close', function() {
        clearInterval(interval_id);
    }); 
}); 

expressj의 예를 다음에 나타냅니다.expressjs가 없으면 그런 것 같아요.

이것은 Node.js에서 가능합니다.pg-query-stream실현합니다.

실현은 포스트그레SQL 호환. 즉, Node.js 애플리케이션은 기존의 Postgre를 사용할 수 있습니다.SQL 클라이언트는 Materialize와 상호 작용합니다.

단, Postgre와는 달리SQL에서는 Materialize를 사용하여 Node.js 응용 프로그램에서 증분적으로 업데이트된 Materialize 뷰를 사용하여 시점 뷰 상태를 조회하는 대신TAIL스테이트먼트를 사용하여 뷰 변경 시 업데이트 스트림을 요청합니다.

샘플 앱은 다음과 같습니다.

import express from 'express'
import pg from 'pg'
import QStream from 'pg-query-stream'

const app = express();
const port = 3000

app.get('/questions', async (request, response) => {

    const client = new pg.Client('postgres://materialize@SERVER_IP:6875/materialize');

    await client.connect();

    const query = new QStream('TAIL your_materialized_view WITH (PROGRESS)', [], {batchSize: 1});

    const stream = client.query(query);

    response.setHeader('Content-Type',  'text/event-stream');

    for await (const event of stream) {
        if(event.id){
            response.write(`data: ${JSON.stringify(event)}\n`);
        }
    }

})

app.listen(port)

자원:

언급URL : https://stackoverflow.com/questions/2558606/streaming-data-with-node-js