2017-12-31 234 views
1

node.js 서버와 클라이언트 연결을 유지하는 것이 좋지 않거나 성능이 전반적으로 좋지 않습니까? (x.end();를 사용하지 않음).node.js에서 서버 클라이언트 응답 연결을 열린 상태로 유지하는 것이 좋지 않습니까?

node.js에서 놀고 싶습니다. 문제가 생길 수 있습니다. node.js 실행 파일을 다중 클라이언트가 통신 할 수 있도록 열린 핸들로 사용하십시오. 서로간에, 지금까지 테스트 한 것은 단지 감각을위한 HTTP 서버를 작성하는 것이며, "테스트"를 작성하는 간격은 5000ms입니다. 그리고 그들이 끊을 때까지 클라이언트와 영원히 소통한다는이 아이디어를 가지고 있기 때문에 나는 핸들을 끝내는 자신을 볼 수 없습니다.

var http = require("http"), 
    date = require("./modules/date.js"); 

var server = http.createServer(function(request, response) { 
    console.log("[" + date.currentTimestamp() + "] Receiving a connection from " + server.address().address); 

    response.writeHead(200, {"Content-Type": "text/html"}); 
    response.write("Hello World!<br>Current time: " + date.currentTimestamp() + "<br>Current url: " + request.url); 
    setInterval(function() { 
     response.write(" test"); 
    }, 5000); 
}).listen(80); 

console.log("[" + date.currentTimestamp() + "] Server has initialized."); 

답변

2

아이디어가 그리 좋지 않다. 긴 폴링을 재발 명했다. 서버 이벤트를 보내는 데 널리 사용되는 서버 - 클라이언트 상호 작용의 패턴이다. 이것이 작동하는 방법입니다. 1. 클라이언트는 서버에 연결하여 일부 이벤트를 구독합니다. 2. 서버는 가능한 한 오랫동안 연결을 유지합니다. 3. 연결이 열려있는 동안 이벤트가 발생하면 서버는 이벤트 페이로드 및 메타 데이터로 응답하고 연결을 닫습니다. 4. 이벤트가 발생하지 않으면 비활성 클라이언트에서 리소스를 소비하지 않도록 일정 시간 후 연결이 닫힙니다. 5. 두 경우 모두 클라이언트는 다시 이벤트를 재 연결하고 예상합니다. 웹 소켓이 도입되기 전에

enter image description here

롱 폴링이 발명되었다. 웹 소켓은 오랫동안 살아있는 클라이언트 - 서버 이벤트 교환을 위해 설계되었지만 긴 폴링은 좀 더 트릭입니다. 가장 좋은 아이디어는 그것을 지원하는 브라우저에 websocket을 사용하고 그렇지 않은 브라우저에 대해서는 긴 폴링으로 폴백하는 것입니다. socket.io와 같은 일부 라이브러리는 자동으로이를 수행 할 수 있습니다.

3

HTTP 프로토콜은 요청 - 응답 패러다임입니다. 대화에서 한 가지 말과 다른 말을하는 사람이 있습니다. 코드는 작동하지만 프로토콜은 디자인 된 방식대로 사용되지 않습니다. 목표를 달성하는 더 좋은 방법은 websocket을 사용하는 것입니다. 웹 소켓은 열린 상태로 유지되고 오래 지속되는 연결을 위해 데이터를 앞뒤로 전송하도록 설계되었습니다.

+0

소켓 프로토콜의 사용은 아마도 OP가 의도하는 것의 관리를위한 최선이라고 말할 것입니다. – simon