node 정적 서버 인터럽트 리셋 실현

2289 단어
사용자가 정적 파일 서버에서 노래와 같은 흐르는 미디어 파일을 가져올 때, 네트워크 연결이 끊어지고, 다시 연결된 후에 처리하지 않으면, 이 파일을 다시 다운로드해야 한다.그래서 이런 상황을 피하기 위해 우리 서버는 인터럽트 리셋 기능을 필요로 한다.한편, http1.1에 마침 Range 메커니즘이 규정되어 있는데 우리는 이런 메커니즘을 통해 분할 전송을 할 수 있다.

Range


서버 지원Range을 할 때 클라이언트는 보내야 할 내용을 여러 부분으로 나누어 서버에 보낼 수 있고 서버는 매번 일부 내용을 수신할 수 있다.이러한 능력이 생겨서 네트워크가 끊어지는 상황에 직면하면 우리는 클라이언트가 이미 전송한 파일 범위를 기록하고 네트워크가 복구된 후에 나머지 부분을 서버에 보낼 수 있다. 이렇게 하면 인터럽트 리셋을 실현할 수 있다.Range의 http 1.1에 대한 구체적인 정의는 문서를 참고할 수 있다.
  • rfc2616

  • 구체적인 절차는 다음과 같다.
  • 브라우저 요청 내용입니다.
  • 서버는 브라우저에 이 내용을 Accept-Ranges 메시지 헤더로 부분적으로 요청할 수 있다고 알려 줍니다.
    response.setHeader('Accept-Ranges', 'bytes');
    
  • 브라우저가 요청을 다시 보내면 Range 메시지 헤더로 서버에 필요한 내용 범위를 알려줍니다.보내는 Range 형식: 바이트 수(bytes) = (시작) - (끝) 이것은 브라우저가 서버에 필요한 부분적인 내용 범위를 알려주는 메시지 헤더입니다.시작과 끝 위치는 모두 포함되어 있으며, 0부터 시작됩니다.이 메시지 헤더는 두 위치를 보내지 않아도 됩니다. 그 의미는 다음과 같습니다.
  • 종료 위치가 삭제되면 서버는 성명의 시작 위치에서 전체 내용의 종료 위치로 마지막 사용 가능한 바이트를 되돌려줍니다.
  • 시작 위치가 삭제되면 끝 위치 파라미터는 마지막으로 사용할 수 있는 바이트부터 서버에 되돌아올 수 있는 바이트 수로 설명될 수 있습니다.


  • 서버는 브라우저의 요청에 응답하는 두 가지 상황으로 나뉩니다.
  • 만약 범위가 합리적이라면 서버는 요청한 일부 내용을 되돌려주고 206 Partial Content 상태 코드를 가지고 갈 것이다.현재 컨텐트의 범위는 Content-Range 헤더에 표시됩니다.전송된 Content-Range 형식: 바이트 수(bytes) = (시작) - (끝)/(총수)
  • 만약 범위가 사용할 수 없는 경우(예를 들어 내용의 총 바이트보다 큰 경우), 서버는 416 요청 범위가 불합리한 Requested Range Not Satisfiable 상태 코드를 되돌려줍니다.사용 가능한 범위는 Content-Range 헤더에서도 선언됩니다.

  • nodejs 간단한 실현

    getStream(req, res, filepath, statObj) {
        let start = 0;
        let end = statObj.size - 1;
        let range = req.headers['range'];
        if (range) {
            res.setHeader('Accept-Range', 'bytes');
            res.statusCode = 206;
            let result = range.match(/bytes=(\d*)-(\d*)/);
            if (result) {
                start = isNaN(result[1]) ? start : parseInt(result[1]);
                end = isNaN(result[2]) ? end : parseInt(result[2]) - 1;
            }
        }
        return fs.createReadStream(filepath, {
            start, end
        });
    }
    

    계속 기다리다


    자기 소결


    node 정적 서버를 구축하는 과정에서 Http1.1의Range를 이용하여 인터럽트 리셋 기능을 실현하는 것을 배운다
    참고 자료
  • Node.js에서 HTTP 206 컨텐츠 분할 구현
  • 좋은 웹페이지 즐겨찾기