putData

Класс: matlab.net.http.io.ContentConsumer
Пакет: matlab.net.http.io

Обработка или сохранение следующего буфера данных для ContentConsumer

Синтаксис

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

Описание

[size,stop] = putData(consumer,data) обеспечивает буфер data чтение с сервера на consumer.

MATLAB® вызывает putData. Пользователи подкласса могут переопределить этот метод, чтобы получить потоковые данные. Ваш потребитель должен вернуть длину данных, которые он фактически обработал в sizeи истинное/ложное указание в stop чтобы указать, хочет ли он получить дополнительные данные из этого сообщения.

Когда MATLAB вызывает putData с пустым data аргумент означает, что часть сообщения или сообщения в случае многочастного сообщения завершена.

Если вы создаете подкласс потребителя, который реализует этот метод, ваше putData метод может вызвать его суперкласс putData использовать преимущества любых преобразований или обработки, которые реализует суперкласс.

MATLAB ограничивает размер data буферы к bufsize значение, возвращенное start метод или внутренний buffer size, если bufsize является []. Кроме того, если сервер отправляет сообщение с кодировкой порций, то данный вызов putData никогда не предоставляет больше одного фрагменты. Это позволяет потребителю получать медленно прибывающие фрагменты своевременно, даже если bufsize намного больше, чем размер фрагмента.

Поведение по умолчанию putData() в этом базовом классе:

Потребители подкласса имеют опцию хранения своего возможно преобразованного содержимого непосредственно в Response.Body.Data, либо пошагово, либо все сразу, или утилизировать его каким-либо другим способом. Потребителю подкласса не нужно вызывать эту putData метод для хранения данных. Для удобства, потребители, которые хотят хранить содержимое постепенно в Response.Body.Data можно вызвать этот метод для этого. Этот метод добавляет data на Response.Body.Data использование AppendFcn, попытка сделать это эффективно путем постепенного распределения емкости. Фактическая длина хранимых данных сохраняется в CurrentLength свойство, которое может быть меньше фактической длины Response.Body.Data. В конце передачи (для примера, когда putData(consumer,[]) или putData(consumer,uint8.empty) вызывается, Response.Body.Data обрезается до CurrentLength. Вы можете задать свою собственную AppendFcn для реализации альтернативного метода добавления.

По умолчанию этот метод всегда возвращает size равным numel(data) и stop равно false.

Если вы намерены использовать этот метод для хранения данных и знаете максимальную длину данных, которые будут храниться, то вы должны задать Response.Body.Data в вектор необходимого размера, заполненный значениями по умолчанию (для примера, нули), перед первым вызовом этого метода. Этот метод начинает хранить данные в начале области данных, а затем обрезает их до длины данных в конце сообщения, сохраняя длину данных, хранящихся в CurrentLength.

Потребители, которые вызывают этот метод в этом базовом классе для инкрементного хранения данных, могут предоставить data любого типа, поддерживающего horzcat или vertcat, включая структуры и массивы ячеек. Если вы предоставляете массив ячеек, существующие Данные преобразуются в массив ячеек, если его еще нет, и элементы массива ячеек вставляются в существующий массив ячеек с линейным индексом, начинающимся с CurrentLength+1.

Если вы вызываете этот метод в ContentConsumer чтобы хранить данные, тогда вы должны позволить этому методу управлять Response.Body.Data или CurrentLength и не изменять их непосредственно.

ContentConsumers этот вызов этого метода в суперклассе должен быть подготовлен для выполнения любой очистки, такой как закрытие окон или удаление временных файлов, если суперкласс выдает исключение.

Входные параметры

расширить все

Потребитель содержимого, заданный как matlab.net.http.io.ContentConsumer объект.

Буфер необработанных данных в matlab.net.http.ResponseMessage объект, заданный как один из следующих:

  • непустые uint8 вектор - Нормальный буфер данных, считанных с сервера.

  • uint8.empty - Конец данных. Это обычный способ, которым MATLAB указывает, что ответное сообщение окончено. Это означает, что потребитель должен очистить (для примера, удалить временные файлы или обрезать данные отклика до текущей длины) и подготовиться к возможному будущему вызову для инициализации последующего сообщения. В ответ потребитель должен вернуться stop=true и size=0 чтобы указать, что обработка прошла успешно без обработки новых байтов. Если потребитель возвращается size=[], затем у потребителя возникла проблема с доработкой данных и MATLAB выдает HTTPException назад к вызывающему абоненту RequestMessage.send.

  • [] (пустой double) - сервер, сетевая проблема или пользователь (используя Ctrl+C) прервал передачу. Потребитель обычно должен убирать точно так же, как будто uint8.empty был получен, но некоторые потребители могут удалить все полученные неполные данные. По возвращении из putDataMATLAB выдает HTTPException чьи History.Response содержит любые данные, которые потребитель хранил в своих Response свойство.

Большинство потребителей, которых не волнует различие между [] и uint8.empty можно просто проверить isempty(data) и убирать соответствующим образом. В каждом случае, где data пуст, потребители должны вызвать суперкласс putData с таким же пустым значением, даже если они не используют свой суперкласс putData хранить данные, так как это единственный способ очистки суперкласса. После получения пустого значения data, реализации должны игнорировать последующие вызовы в putData с пустыми значениями до следующего вызова start. Обычно они должны возвращаться stop=false и size=0 на последующих вызовах и не выполнять никакой дополнительной обработки.

Выходные аргументы

расширить все

Длина данных, обработанных, возвращенных как двойной или пустой двойной. Если значение size является:

  • size >= 0, size <= length(data) - Количество байтов data обрабатывается этим вызовом в putData. Это число используется только в интересах подклассов этого потребителя, чтобы знать, сколько данных было обработано. Это не влияет на будущие вызовы к putData. Если data пуст, тогда size игнорируется.

  • size < 0 - Результат abs(size) - количество обработанных байтов. Как и в предыдущем случае, но в сложение MATLAB молча пропускает оставшуюся часть данных, совершая еще один вызов putData(uint8.empty) в конце данных. Если a MultipartConsumer не используется, это похоже на возврат stop=true, за исключением дополнительного вызова на putData в конце. Если MultipartConsumer используется, отрицательное значение size завершает только часть, и не влияет на обработку последующих частей сообщения, поэтому соединение не закрывается до тех пор, пока не будет достигнута следующая часть или конец сообщения.

  • size = [] (пустой двойной) - потребитель решил что-то пошло не так с передачей и дальнейшие переводы с сервера должны быть прекращены. Это похоже на stop=true, но это считается ошибкой, вызывающей стандартное HTTPException чтобы быть брошенным к вызывающему абоненту RequestMessage.send указывает, что потребитель прервал соединение. В этом случае единственный способ получить частично обработанную ResponseMessage через HTTPException.History.

    Как альтернатива возвращению size=[] чтобы выдать стандартное исключение, ваш putData метод может непосредственно выдать свое исключение, которое MATLAB переносит как причину в HTTPException возвращен вызывающему абоненту RequestMessage.send.

Укажите, нужно ли получать дополнительные данные из этого сообщения, заданное как true или false. Если stop является trueзатем MATLAB останавливает обработку остальной части сообщения, включая любые последующие части многочастного сообщения, обрабатываемого MultipartConsumer, молча продолжая, как если бы конец сообщения был достигнут, даже если сообщение имеет больше данных. Это немедленно закрывает соединение с сервером и никакая ошибка не возвращается к вызывающему абоненту RequestMessage.send. Это не рассматривается как условие ошибки и является нормальным способом завершения приема потока произвольной длины грациозно. Если stop=true и data уже не пуст, MATLAB выполняет один дополнительный вызов в putData с пустыми data. stop=true может быть задано, независимо от того data пуст.

Потребители не должны нормально устанавливать stop=true в конце data, потому что, если они являются многопартийными делегатами, это приведет к прекращению обработки для остальной части сообщения. Чтобы прекратить обработку только для своей части сообщения, потребители должны вернуться size < 0 чтобы указать, что они не хотят получать больше данных для своей части.

Признаки

Accesspublic
Введенный в R2018a