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"> </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
'programing' 카테고리의 다른 글
MongoDB mongorestore 오류: local:::facet::_S_create_c_locale 이름이 잘못되었습니다. (0) | 2023.03.31 |
---|---|
FancyBox iframe이 부모를 반환합니다.정의되지 않은 $(WordPress 사용) (0) | 2023.03.31 |
create-react-app로 구축된 React 프로젝트를 다음 create-react-app 버전으로 업그레이드하는 방법은 무엇입니까? (0) | 2023.03.31 |
AngularJS에서 ng-model="my_{$index}"를 ng-model로 동적으로 생성하는 방법 (0) | 2023.03.31 |
AngularJS를 사용하여 다른 페이지로 리다이렉트하는 방법 (0) | 2023.03.31 |