Main Content

putData

클래스: matlab.net.http.io.ContentConsumer
패키지: matlab.net.http.io

ContentConsumer에 대한 다음 데이터 버퍼 처리 또는 저장

구문

[size,stop] = putData(consumer,data)

설명

[size,stop] = putData(consumer,data)는 서버에서 읽어 들인 버퍼 dataconsumer에게 제공합니다.

MATLAB®putData를 호출합니다. 서브클래스 소비자는 스트리밍된 데이터를 수신하도록 이 메서드를 재정의할 수 있습니다. 소비자는 실제로 처리한 데이터의 길이를 size로 반환하고, 이 메시지로부터 추가 데이터를 수신하기를 원하는지 나타내는 true/false를 stop으로 반환해야 합니다.

MATLAB이 빈 data 인수로 putData를 호출한다는 것은 메시지 또는 multipart 메시지의 메시지 파트가 종료되었음을 의미합니다.

사용자가 이 메서드를 구현하는 소비자 서브클래스를 구현한 경우, putData 메서드는 슈퍼클래스 putData를 호출하여 슈퍼클래스가 구현한 변환이나 처리를 활용할 수 있습니다.

MATLAB은 data 버퍼의 크기를 start 메서드가 반환한 bufsize 값으로 제한하거나, bufsize[]인 경우 내부 버퍼 크기로 제한합니다. 서버가 청크로 인코딩된 메시지를 전송하는 경우, 기존에 수행한 putData 호출로는 둘 이상의 청크를 수신할 수 없습니다. 따라서 소비자는 bufsize가 청크 크기보다 훨씬 큰 경우에도 천천히 도착하는 청크를 제때에 수신할 수 있습니다.

이 기본 클래스의 putData()의 디폴트 동작은 다음과 같습니다.

서브클래스 소비자는 변환되었거나 변환되었을 가능성이 있는 콘텐츠를 단계적으로 또는 한꺼번에 Response.Body.Data에 직접 저장할 수도 있고, 다른 방식으로 삭제할 수도 있습니다. 서브클래스 소비자는 데이터를 저장하기 위해 이 putData 메서드를 호출할 필요가 없습니다. 콘텐츠를 Response.Body.Data에 단계적으로 저장하고자 하는 소비자는 이 메서드를 호출하면 됩니다. 이 메서드는 AppendFcn을 사용하여 dataResponse.Body.Data에 추가하는데, 용량을 단계적으로 할당하여 효율적인 추가가 이루어지도록 시도합니다. 저장된 데이터의 실제 길이는 CurrentLength 속성에 저장됩니다. 이 값은 Response.Body.Data의 실제 길이보다 작을 수 있습니다. 전송이 완료되면(예를 들어 putData(consumer,[]) 또는 putData(consumer,uint8.empty)가 호출되면) Response.Body.DataCurrentLength로 잘립니다. 사용자는 자체 AppendFcn을 정의하여 다른 추가 메서드를 구현할 수 있습니다.

기본적으로 이 메서드는 항상 numel(data)와 동일한 sizefalse와 동일한 stop을 반환합니다.

데이터를 저장하기 위해 이 메서드를 사용하고자 하는 사용자가 저장할 데이터의 최대 길이를 알고 있는 경우에는 이 메서드를 최초로 호출하기 전에 먼저 디폴트 값(예: 0)으로 채워진 원하는 크기의 벡터로 Response.Body.Data를 설정해야 합니다. 이 메서드는 데이터 영역의 시작 부분에서 데이터를 저장하기 시작한 다음 메시지의 끝 부분에서 데이터를 데이터의 길이에 따라 잘라 CurrentLength에 저장된 데이터의 길이를 유지합니다.

데이터를 단계적으로 저장하기 위해 이 기본 클래스에서 이 메서드를 호출하는 소비자는 구조체와 셀형 배열을 포함하여 horzcat 또는 vertcat을 지원하는 모든 유형의 data를 제공할 수 있습니다. 셀형 배열을 제공하는 경우, 기존 데이터는 셀형 배열이 아닌 경우 셀형 배열로 변환되며, 셀형 배열의 요소는 CurrentLength+1에서 시작하는 기존 셀형 배열의 선형 인덱스에 삽입됩니다.

데이터를 저장하기 위해 ContentConsumer에서 이 메서드를 호출하는 경우, Response.Body.DataCurrentLength를 직접 수정하는 대신 이 메서드가 해당 속성을 관리하도록 해야 합니다.

슈퍼클래스에서 이 메서드를 호출하는 ContentConsumers는 슈퍼클래스가 예외를 발생시키는 경우 창 닫기, 임시 파일 삭제하기와 같은 정리 작업을 수행할 준비가 되어 있어야 합니다.

입력 인수

모두 확장

콘텐츠 소비자로, matlab.net.http.io.ContentConsumer 객체로 지정됩니다.

matlab.net.http.ResponseMessage 객체 내 원시 데이터로 구성된 버퍼로, 다음 중 하나로 지정됩니다.

  • 비어 있지 않은 uint8 벡터- 서버로부터 읽어 들인 데이터로 구성된 정규 버퍼.

  • uint8.empty - 데이터의 끝. 이는 MATLAB이 응답 메시지가 종료되었음을 나타내는 일반적인 방식입니다. 소비자는 이를 통해 정리 작업(예: 임시 파일 삭제하기, 응답 데이터를 현재 길이로 자르기)를 수행하고 다음 메시지를 초기화하기 위한 향후 호출 가능성에 대비해야 함을 알 수 있습니다. 소비자는 이에 대응하여 새로 처리된 바이트 없이 처리가 성공적으로 수행되었음을 나타내기 위해 stop=truesize=0을 반환해야 합니다. 소비자가 size=[]을 반환하면 소비자가 데이터를 완료하는 데 문제가 있었음을 나타내며, 이때 MATLAB은 RequestMessage.send 호출자에게 HTTPException을 발생시킵니다.

  • [](빈 double형) - 서버, 네트워크 문제 또는 사용자가 (Ctrl+C를 사용하여) 전송을 중단했습니다. 소비자는 uint8.empty를 수신한 것처럼 정리 작업을 수행해야 하나, 일부 소비자의 경우 이미 수신한 완료되지 않은 데이터를 삭제할 수 있습니다. putData에서 반환되면 MATLAB은 소비자가 Response 속성에 저장한 데이터를 포함하는 History.Response를 갖는 HTTPException을 발생시킵니다.

[]uint8.empty의 차이에 신경 쓰지 않는 대부분의 소비자의 경우 isempty(data)를 확인하여 그에 맞게 정리하면 됩니다. data가 비어 있으면 데이터를 저장하기 위해 슈퍼클래스의 putData를 사용하지 않는 경우에도 매번 해당 빈 값을 사용하여 슈퍼클래스의 putData를 호출해야 합니다. 이것이 슈퍼클래스가 정리해야 함을 알 수 있는 유일한 방법이기 때문입니다. 빈 data 값을 수신한 뒤에는 다음번에 start가 호출될 때까지 빈 값을 갖는 putData 호출은 모두 무시해야 합니다. 일반적으로 이러한 호출은 이후 호출에서 stop=falsesize=0을 반환하고, 추가 처리를 수행하지 않습니다.

출력 인수

모두 확장

처리되는 데이터의 길이로, double형 또는 빈 double형으로 반환됩니다. size의 값에 따른 동작:

  • size >= 0, size <= length(data) - 이번 putData 호출에 따라 처리된 data의 바이트 수. 이 수는 이 소비자의 서브클래스가 처리된 데이터가 얼마인지 알 수 있도록 하기 위한 목적으로만 사용되며, 향후 putData 호출에는 영향을 주지 않습니다. data가 비어 있으면 size는 무시됩니다.

  • size < 0 - abs(size)의 결과는 처리된 바이트 수입니다. 앞 경우와 동일하나, 여기에 더해 MATLAB은 아무런 오류도 표시하지 않고 나머지 데이터를 건너뛰고 데이터의 끝 부분에서 한 번 더 putData(uint8.empty)를 호출합니다. MultipartConsumer가 사용되지 않는 경우에는 끝 부분에 추가로 putData가 호출된다는 점을 제외하면 stop=true를 반환하는 것과 유사합니다. MultipartConsumer가 사용되는 경우, size가 음수 값이면 해당 파트만 종료하고 메시지의 이후 부분의 처리에는 영향을 주지 않으므로 메시지의 다음 파트나 끝에 도달할 때까지 연결이 끊기지 않습니다.

  • size = [](빈 double형) - 소비자는 전송에서 문제가 발생했으므로 서버로부터의 추가 전송이 중지되어야 한다고 판단합니다. 이는 stop=true와 유사하나 오류로 간주되기 때문에 RequestMessage.send의 호출자에게 표준 HTTPException이 발생되어 소비자가 연결을 중단했음을 알려 줍니다. 이 경우 호출자가 부분적으로 처리된 ResponseMessage를 가져올 유일한 방법은 HTTPException.History를 통한 것입니다.

    size=[]을 반환하여 표준 예외를 발생시키는 대신 putData 메서드가 자체 예외를 발생시킬 수도 있습니다. 이 경우 MATLAB은 해당 예외를 원인으로서 HTTPException에 래핑(Wrapping)하고 RequestMessage.send 호출자에게 반환합니다.

이 메시지로부터 추가 데이터를 수신할지 여부를 나타내는 표시로, truefalse로 지정됩니다. stoptrue이면 MATLAB은 MultipartConsumer에 의해 처리되고 있는 multipart 메시지의 이후 파트를 포함하여 나머지 메시지에 대한 처리를 중단하고, 메시지에 데이터가 더 있다 하더라도 메시지의 끝에 도달한 것처럼 아무런 오류도 표시하지 않고 계속 진행합니다. 이로 인해 서버와의 연결이 즉시 끊기고 RequestMessage.send의 호출자에게 오류가 반환되지 않습니다. 이는 오류 조건으로 간주되지 않으며, 임의 길이의 스트림의 수신을 정상적으로 종료하는 일반적인 방법입니다. stop=true이고 data가 아직 비어 있지 않은 경우, MATLAB은 빈 data를 사용하여 추가로 putData를 한 번 호출합니다. data가 비어 있는지 여부에 관계없이 stop=true가 설정될 수 있습니다.

소비자는 일반적으로 data 끝에 stop=true를 설정하면 안 됩니다. 소비자가 multipart 대리자인 경우 이렇게 설정하면 나머지 메시지의 처리가 종료되기 때문입니다. 소비자가 자체 메시지 파트에 대해서만 처리를 종료하려면 size < 0을 반환하여 해당 파트의 추가 데이터를 수신하기를 원치 않음을 나타내야 합니다.

특성

Accesspublic

버전 내역

R2018a에 개발됨