publicclassTesteWB2{/** * @param args the command line arguments */publicstaticvoidmain(String[]args){try{DefaultHttpClienthttpClient=newDefaultHttpClient();HttpGetgetRequest=newHttpGet("http://localhost:8080/ServidorWebPerformancei/atualizacaoCompleta/atualizarSistemaCompleto/23");getRequest.addHeader("accept","application/zip");HttpResponseresponse=httpClient.execute(getRequest);if(response.getStatusLine().getStatusCode()!=200){thrownewRuntimeException("Failed : HTTP error code : "+response.getStatusLine().getStatusCode());}/// long l = response.getEntity().getContent()getContentLength();BufferedReaderbr=newBufferedReader(newInputStreamReader((response.getEntity().getContent())));Stringoutput;System.out.println("Output from Server .... \n");while((output=br.readLine())!=null){System.out.println(output);}httpClient.getConnectionManager().shutdown();}catch(Exceptione){e.printStackTrace();}}}
Ter um recurso chamado “/atualizacaoCompleta” no path é OK, mas ter um caminho “/atualizarSistemaCompleto” é muuuuito errado.
Você está usando commons-http para consumir o serviço, é isso? Porque não usa a API do seu framework REST?
[]'s
com relação ao item 2 estou corrigindo, é pq eu peguei o projeto no meio do caminho.
Com relação ao item 3 estou usando o commons-http pq ele tem menos jar do que o Jersey, depois vou colocar o cliente no Android.
Estou tentando passar um .zip, pq a informação que esta chegando no android esta demorando muito, em media 10 minutos para atualizar todo o sistema.
Mas ja vi varios fatores que estao deixando lento:
A pessoal que comecou esta buscando tabela por tabela, por exemplo, primeiro atualiza o cliente, ai abre uma conexao espera a boa vontade da rede, recebe os dados, grava no android e depois fecha a conexao. com isso sao aproximadamente 20 vezes. Estou colocando isso em um unico XML. Espero que melhore!!
Att
V
vcsmetallica
Olha so, O arquivo ate agora esta dando 1.3 mb quando eu compacto ele esta dando 100 kb.
A
Alexandre_Saudate
Sim, mas o que eu quero dizer é que, se você retornar um array de bytes (ao invés de um StreamingOutput) deve ficar mais fácil
V
vcsmetallica
Blza, Consegui passar o array de bytes para o cliente.
So que não estou conseguindo passar o meu array de bytes em um arquivo.
segue o codigo:
publicstaticvoidmain(String[]args){try{DefaultHttpClienthttpClient=newDefaultHttpClient();HttpGetgetRequest=newHttpGet("http://localhost:8080/ServidorWebPerformancei/atualizacaoCompleta/atualizarSistemaCompleto/23");getRequest.addHeader("accept","application/json");HttpResponseresponse=httpClient.execute(getRequest);if(response.getStatusLine().getStatusCode()!=200){thrownewRuntimeException("Failed : HTTP error code : "+response.getStatusLine().getStatusCode());}BufferedReaderbr=newBufferedReader(newInputStreamReader((response.getEntity().getContent())));longtamanho=response.getEntity().getContentLength();bytecontent[]=newbyte[(int)tamanho];Stringoutput;System.out.println("Gravando Zip no arquivo temporario \n");FilefileTemp=File.createTempFile("arquivo",".zip");FileWriterfw=newFileWriter(fileTemp,true);PrintWriterpw=newPrintWriter(fw);BufferedWriterbw=newBufferedWriter(pw);intreadCount=0;while((output=br.readLine())!=null){bw.write(output);System.out.println(output);}bw.flush();bw.close();httpClient.getConnectionManager().shutdown();}catch(Exceptione){e.printStackTrace();}}
longtamanho=response.getEntity().getContentLength();bytecontent[]=newbyte[(int)tamanho];Stringoutput;System.out.println("Gravando Zip no arquivo temporario \n");FilefileTemp=File.createTempFile("arquivo",".zip");FileWriterfw=newFileWriter(fileTemp,true);PrintWriterpw=newPrintWriter(fw);BufferedWriterbw=newBufferedWriter(pw);intreadCount=0;while((output=br.readLine())!=null){bw.write(output);System.out.println(output);}bw.flush();bw.close();
quando vou abrir o arquivo esta dando erro. falando que o arquivo esta com erro no cabecalho.
Eu tenho que pegar o Array de bytes que esta chegando para mim e gravar ele. Não estou sabendo como pegar o array de bytes e gravar!
A
Alexandre_Saudate
Tira esse PrintWriter do meio. Ele vai converter seu array de bytes em texto.
V
vcsmetallica
ja tentei ler assim tambem:
DataInputStreamdis=newDataInputStream(response.getEntity().getContent());longtamanho=response.getEntity().getContentLength();bytecontent[]=newbyte[(int)tamanho];Stringoutput;System.out.println("Gravando Zip no arquivo temporario \n");FilefileTemp=File.createTempFile("arquivo",".zip");dis.read(content);FileOutputStreamfos=newFileOutputStream(fileTemp);DataOutputStreamoutputStream=newDataOutputStream(fos);outputStream.write(content);outputStream.flush();outputStream.close();dis.close();
e nada, quando vou abrir o meu zip da problema!!!
A
Alexandre_Saudate
Tem certeza que o zip no servidor está abrindo corretamente? E os parâmetros de tamanho, conteúdo, etc., você já checou se estão corretos?
V
vcsmetallica
sim. No servidor esta abrindo corretamente.
Ai eu transformo ele em um array de bytes e mando ele para o cliente.
ai estou tentando usar o seguinte código para transformar ele zip novamente.
bytecontent[]=newbyte[(int)tamanho];Stringoutput;System.out.println("Gravando Zip no arquivo temporario \n");FilefileTemp=newFile("c:\\temp\\arquivo.zip");DataInputStreamdis=newDataInputStream(response.getEntity().getContent());dis.read(content);FileOutputStreamfos=newFileOutputStream(fileTemp);DataOutputStreamoutputStream=newDataOutputStream(fos);outputStream.write(content);outputStream.flush();outputStream.close();dis.close();
Outra coisa que eu reparei foi o tamanho, esta o mesmo tamanho em ambas as partes.
A
Alexandre_Saudate
vcsmetallica:
sim. No servidor esta abrindo corretamente.
Ai eu transformo ele em um array de bytes e mando ele para o cliente.
ai estou tentando usar o seguinte código para transformar ele zip novamente.
bytecontent[]=newbyte[(int)tamanho];Stringoutput;System.out.println("Gravando Zip no arquivo temporario \n");FilefileTemp=newFile("c:\\temp\\arquivo.zip");DataInputStreamdis=newDataInputStream(response.getEntity().getContent());dis.read(content);FileOutputStreamfos=newFileOutputStream(fileTemp);DataOutputStreamoutputStream=newDataOutputStream(fos);outputStream.write(content);outputStream.flush();outputStream.close();dis.close();
Observei o seguinte.
Quando eu mando para o cliente o array de bytes ele esta chegando incompleto, faltando algumas partes.
No lado do servidor esta certinho.
Tive que ler byte a byte para colocar dentro do array de byte.
Valeu muito pela ajuda.
A
Alexandre_Saudate
vcsmetallica:
Observei o seguinte.
Quando eu mando para o cliente o array de bytes ele esta chegando incompleto, faltando algumas partes.
No lado do servidor esta certinho.
Ah, sim… esse é um problema comum em aplicações desse tipo. O array de bytes é disponibilizado, mas o fornecimento dos bytes só termina depois de um certo tempo. Teoricamente, coordenar o tamanho recebido dos dados e um BufferedInputStream resolve.