Olá Amigos,
estou desenvolvendo duas aplicações, um Servidor em Java e um cliente em Android. O problema é que estou tentando transferir uma imagem (que está em arquivo e por isto nem está na memória) do servidor para o cliente, só que aparentemente o cliente não recebe todos os dados ou não é informado do fim do envio do arquivo.
Eu imprimi um log do envio das duas aplicações, e veja como estão diferentes o envio e o recebimento:
Servidor:
Enviando= 4096
Enviando= 4096
Enviando= 4096
Enviando= 4096
Enviando= 4096
Enviando= 3479
Saiu -1
Cliente:
leitura=‘1448’
leitura=‘1448’
leitura=‘4096’
leitura=‘4096’
leitura=‘4096’
leitura=‘4096’
leitura=‘4096’
leitura=‘584’
Alguém poderia me ajudar por favor?
Servidor
public boolean sincronizaCroquis(DataInputStream in, DataOutputStream out, OutputStream ous) throws IOException {
//Aguarda um OK
msg = in.readUTF();
int qtd = 0;
//Verifica a mensagem recebida
if (msg.equals(Constantes.OK)) {
controle.addMessage("Sincronizando croquis.");
//Aguarda um pedido de sincronização
msg = in.readUTF();
//Enquanto o cliente estiver sincronizando croquis
while (msg.equals(Constantes.SINC_CROQUI)) {
//Caso a mensagem seja para sincronizar croqui
if (msg.equals(Constantes.SINC_CROQUI)) {
//Recebe o idLocalidade
int idLocalidade = in.readInt();
//Abre o arquivo para envio
File file = new File("croquis/" + idLocalidade + ".png");
FileInputStream fin = new FileInputStream(file);
//Cria um buffer de 4KB
int tamanho = 1024;
byte[] buffer = new byte[tamanho];
//Envia dados
Integer leitura = fin.read(buffer, 0, tamanho);
while (leitura != -1) {
System.out.println("Enviando= " + leitura);
System.out.flush();
ous.write(buffer, 0, leitura);
leitura = fin.read(buffer, 0, tamanho);
}
out.write(leitura);
System.out.println("Saiu " + leitura);
out.flush();
qtd++;
}
msg = in.readUTF();
}
controle.addMessage("Total de croquis sincronizados: " + qtd);
}
return true;
}
Cliente:
/**
* Recebe um croqui via Socket e anexa a sua localidade
* @throws IOException
*/
public boolean recebeCroqui(Integer idLocalidade, ConnectionSocket connection) throws IOException{
//Abre os devidos canais de comuicação
DataOutputStream out = connection.getDataOutput();
InputStream ins = connection.getIns();
//InputStreamReader insReader = new InputStreamReader(ins);
//BufferedReader reader = new BufferedReader(insReader);
//String name = reader.readLine();
//Envia um SINC_CROQUI - avisando ao servidor para sincronizar um croqui
Log.d("ufop.smid", "Recebendo um croqui.");
out.writeUTF(Constantes.SINC_CROQUI);
//Envia idLocalidade
Log.d("ufop.smid", "Enviando Localidade.");
out.writeInt(idLocalidade);
//FileOutputStream para salvar o arquivo
File path = new File(Environment.getExternalStorageDirectory() + Constantes.DIRETORIO_CROQUIS);
Log.d("ufop.smid", "Criando diretório caso não exista.");
path.mkdirs();
FileOutputStream fOut = new FileOutputStream(new File(path, idLocalidade + ".png"));
//Recebe os bytes do croqui
Log.d("ufop.smid", "Recebendo bytes.");
int tamanho = 1024; //tamanho 4KB
byte[] buffer = new byte[tamanho];
Integer leitura = ins.read(buffer, 0 , tamanho);
while(leitura != -1){
Log.d("ufop.smid", "leitura='" + leitura +"'");
fOut.write(buffer, 0, leitura);
leitura = ins.read(buffer, 0 , tamanho);
}
//Fecha o arquivo
fOut.flush();
fOut.close();
Log.d("ufop.smid", "Croqui recebido com sucesso!");
return true;
}