отправка изображения с сервера java в приложение для Android - PullRequest
0 голосов
/ 13 августа 2011

Я хотел бы отправить файл изображения с Java-сервера в приложение для Android, используя этот код:

Сервер (Java):

File file = new File("./clique.jpg");

FileInputStream stream = new FileInputStream(file);

DataOutputStream writer = new DataOutputStream(socket.getOutputStream());        

byte[] contextB = new byte[4096];

int n;
int i = 0;
while ( (n=stream.read(contextB))!=-1 ){
    writer.write(contextB, 0, n);
    writer.flush();
    System.out.println(n);
    i+=n;
}
writer.flush();
stream.close();

Приложение для Android:

DataInputStream reader = new DataInputStream(socket.getInputStream());
            byte[] buffer = new byte[4096];
            ByteArrayOutputStream content = new ByteArrayOutputStream();

            int n;
            int i = 0;
            reader = new DataInputStream(socket.getInputStream());
            while ( (n=reader.read(buffer)) != null){                
                content.write(buffer, 0, n);
                content.flush();

            }

            Utility.CreateImageFile(content.toByteArray());

Что я заметил, так это то, что в приложении для Android n, чье число считанных байтов не равно 4096, в то время как я посылаю с сервера байтовые блоки размером 4096, также я не могу получить n = -1, что является концом потока,он блокируется, пока я не закрою приложение, тогда я получу n = -1.

Ответы [ 2 ]

0 голосов
/ 13 августа 2011

У вас проблема с кодом Android:

while ( (n=reader.read(buffer)) != null) {

n не может быть нулевым.

Используйте writer.close () вместо writer.flush () после цикла на сервере.

0 голосов
/ 13 августа 2011

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

Относительно конца потока - в коде вашего сервера вы забыли закрыть выходной поток (вы закрываете только поток, который является входнымПоток - вы также должны закрыть средство записи, которое, в свою очередь, закроет основной выходной поток.

Два комментария:

1) Я бы действительно рекомендовал использовать Buffered Readers / Writers, обертывающие записи / читатели- код, который вы получите, будет лучше, и вам не придется создавать / управлять буферами самостоятельно.

2) Используйте try {} finally и закройте ваши потоки в предложениях finally - это лучший метод, который поможетуверен, что вы закроете потоки и свободные ресурсы даже в случае проблем сочтение / письмо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...