2014-04-01 1 views
0

다트에 TCP 서버 앱을 쓰고 있습니다. 다른 언어로 비슷한 일을 할 때, 크기가 X 인 바이트 버퍼를 보내더라도, onData() 수신 함수는 X만큼 더 작은 버퍼로 여러 번 호출 될 것입니다. 이것은 Flow Control 때문에 발생합니다. 따라서 보통 페이로드의 헤더에는 페이로드 크기가 포함되어 있으며 처리하기 전에 전체 페이로드를 읽을 때까지 기다립니다.TCP 서버 : 조각이 페이로드 전달됩니까?

다트에서도 수동으로 처리해야합니까? 지금까지 문제가 없었고 onData()에 대한 단일 호출에서 전체 페이로드를 받았지만 오히려 요청했습니다.

답변

0

나는 문제가 없지만 응답이 아직 완전히 수신되지 않은 상태에서 데이터 처리를 시작할 수 있습니다.
응답이 큰 경우 모든 데이터를 버퍼링해야합니다. 이렇게하면 사용 가능한 RAM보다 큰 데이터를 수신 할 수 없습니다. 예를 들어 영화 다운로드는 이런 식으로는 불가능합니다.

0

예. 요청에 전송 된 데이터의 정확한 크기가 확실하지는 않지만 POST 또는 다른 방법을 통해 전송되는 데이터에 액세스하기 전에 스트림을 완전히 유출해야 할 때가있을 수 있습니다. (http 요청의 본문에 대해). 다트 자습서의 Creating a server 섹션을 참조하십시오. 특히 스트림이 Handling POST requests에 어떻게 유출되었는지 확인할 수 있습니다.

var buff = []; 
req.listen(buff.addAll, 
    onDone:() { 
    print('Received: ${String.fromCharCodes(buff)}'); 
}); 

HttpRequest class documentation에 대한 자세한 정보를 참조하십시오 : 다음과 같이 일반적으로 오히려 예와 같이 조각을 다시 작성하는 것보다, 그들은 버퍼에 직접 추가됩니다.

http_server package을 사용하면 자동으로 스트림이 비워지고 요청과 함께 전달 된 헤더에 따라 데이터로드를 적절히 처리합니다. 스트림 트랜스 포머를 들어오는 HttpRequests 스트림에 적용하여 HttpRequestBody로 변환함으로써이를 수행합니다. 아래 예제를 참조하십시오. 자세한 내용은 HttpBodyHandler API을 참조하십시오.

HttpServer.bind(...).then((server) { 
    server.transform(new HttpBodyHandler()) 
    .listen((HttpRequestBody body) { 
     // each request is now an HttpRequestBody 
     // which has already drained the stream 
     print(body.type); 
     print(body.body); 
     body.request.response..statusCode = HttpStatus.OK 
     ..writeln('Got it!') 
     ..close(); 
    }); 
});