Отправка данных по сети не работает в java.io API

У меня есть следующий фрагмент кода, который отлично работает при запуске из eclipse

String str = "testing";
 InputStream is = new ********************(str.getBytes());
 int length = is.available();
 byte[] data = new byte[length];
 is.read(data, 0, length);
 System.out.println("output "+new String(data));

Когда я нарушаю этот код, чтобы публиковать данные по сети с помощью API-клиента Jerser и попробовать прочитать его на сервере с помощью Джерси, я не получаю значение, которое я опубликовал. Код клиента выглядит так:

public static void main(String s[]) throws IOException {
 ClientConfig config = new DefaultClientConfig();
 Client client = Client.create(config);
 String str = "testingthi";
 InputStream is = new ********************(str.getBytes());
 WebResource webResource = client.resource("http://192.168.1.15:8090/JersySample/resources/stream/upload");

 ClientResponse response = webResource.type(MediaType.APPLICATION_OCTET_STREAM).post(ClientResponse.class,is);
 is.close();
}

Код на сервере выглядит так:

@Consumes(MediaType.APPLICATION_OCTET_STREAM)
 public Response upload( InputStream is) {
 try{
 int size = is.available();
 byte data[] = new byte[size];
 is.read(data,0,size); 
 System.out.println(" Posted data is "+ new String(data)+" length is "+size+" stream size "+is.available());
 is.close();
 }catch (Exception e) {
 e.printStackTrace();
 }
 return Response.ok().entity("Done").build();
}

Когда я читаю строку, используя apache-commons-io API, я получаю строковое значение, которое я разместил. Может кто-то объяснить, почему он не работает, используя API java.io, который работал в несетевой ситуации?

1 ответ

Вы делаете обычную ошибку, полагая, что read() заполняет буфер. Он не обязан это делать. См. Javadoc. Он обязан читать хотя бы один байт и возвращаться. Количество байтов, возврат -1 или сброс исключения IOException.

Вы также злоупотребляете доступным(). Он не возвращает общее количество байтов в потоке, и способ, которым вы его используете, специально предупреждается в Javadoc.

licensed under cc by-sa 3.0 with attribution.