Я Java разработчик
Я пытаюсь передать неизвестное количество двоичных данных от клиента к серверу по запросу http put. По какой-то причине мой сервер написан на c# (. net ядро), а для удобства мой клиент (который я использую только для тестирования) написан на java.
Как я в ожидании неизвестного количества данных и для проверки моего сервера rest api мой клиент java открывает двоичный файл и отправляет двоичный пакет по запросу HTTP put (например, 160 байт на пакет). Когда я начинаю потоковую передачу данных от клиента, я не могу использовать тело (поток http) на стороне сервера, пока клиент не завершит отправку всех двоичных пакетов.
Используемые http-заголовки: Connection-KeepAlive, Content-Type => application / octetstream, Transfer-Encoding => Chunked
Итак, я хотел бы потреблять тело, не ожидая всего тела.
Любой намек, как это выполнить?
Я думаю об удалении оператора await перед асинхронным c методом, который использует тело и ждет, пока клиент не прервет или не закроет соединение на стороне сервера, но я не знаю, хорошая ли это идея.
Ниже приведен фрагмент кода:
- на стороне сервера, написанный на c#
[HttpPut]
public async Task<IActionResult> SendData(string id, string device, string token){
...
using (MemoryStream ms = new MemoryStream()){
await HttpContext.Request.Body.CopyToAsync(ms);
}
...
//do stuff
}
java client
HttpURLConnection conn = (HttpURLConnection) new URL(
"http://localhost:8080/test"
).openConnection();
byte[] data = Files.readAllBytes(Paths.get(FILE_TO_SEND_PATH));
ByteArrayInputStream is = new ByteArrayInputStream(data);
conn.setRequestMethod("PUT");
conn.setRequestProperty("Content-Type", "application/octet-stream");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setChunkedStreamingMode(160);
//conn.setFixedLengthStreamingMode(is.available());
conn.setDefaultUseCaches(false);
conn.setUseCaches(false);
conn.connect();
OutputStream out = conn.getOutputStream();
//InputStream i = conn.getInputStream();
byte[] bytes = new byte[160];
int read = 0;
while ((read = is.read(bytes)) > 0) {
out.write(bytes, 0, read);
System.out.println(read);
TimeUnit.MICROSECONDS.sleep(125 * read);
out.flush();
}
out.close();