Как отправить байтовый массив с сервера (сервера Jetty) на клиент (RPI)? - PullRequest
0 голосов
/ 15 мая 2018

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

Нижесторона сервера

byte[] b = readByte()// my function which return bytes of Data
ServletOutputStream stream = httpServletResponse.getOutputStream();
stream.flush();
stream.write(b);
stream.flush();

Ниже находится сторона клиента

URL url = new URL("http://localhost:1222/?filePointer=" + fp);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.connect();
InputStream is = conn.getInputStream();
System.out.println("Connection Open");
int pos = 0;
byte[] b = new byte[buffLength];
while (pos != -1) {
    pos = is.read(b, pos, b.length - pos);
}
write2File(b);

Приведенный выше код работает для bufferLength 20Kb, так как bufferLength увеличивается, я получаю неправильные значения.

1 Ответ

0 голосов
/ 16 мая 2018

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

Но клиент должен правильно использовать эту длину. Ваша проблема в цикле чтения клиента:

int pos = 0;
byte[] b = new byte[buffLength];
while (pos != -1) {
    pos = is.read(b, pos, b.length - pos);
}

Существует одна определенная и одна потенциальная главная проблема:

  1. Ваш принимающий код неправильно заполняет целевой массив на третьей и последующих итерациях цикла (когда выполняется столько итераций), поскольку pos записывает только количество байтов, полученных в самой последней предыдущей read(). Вам необходимо использовать общее количество байтов, прочитанных в all предыдущих чтениях в массиве до этой точки, чтобы определить смещение и количество байтов, которые нужно попытаться прочитать.

  2. InputStream.read() вернет -1 только в конце потока , что обычно не происходит в сетевом потоке, пока дальний конец не будет закрыт. Если сервер не закрывает соединение (по крайней мере, выходную сторону) с его конца после записи массива, то клиент зависнет, пытаясь его прочитать. В частности, он будет зацикливаться, если pos равно b.length, поэтому запрошенное число байтов равно 0.

...