Boa tarde, gostaria de saber como eu poderia fazer uma transferência básica de arquivos via socket. Já tentei por inputstream e outputstream, mas o “gravado” espera mais bytes do que há
Posta seu código aí pra gente
Código cliente
int tamanho = 4096; // buffer de 4KB
byte[] buffer = new byte[tamanho];
int lidos = -1;
while ((lidos = entrada.read(buffer, 0, tamanho)) != -1) {
fos.write(buffer, 0, lidos);
System.out.println(lidos);
}
fos.close();
Código servidor
int tamanho = 4096; // buffer de 4KB
byte[] buffer = new byte[tamanho];
int lidos = -1;
while ((lidos = fis.read(buffer, 0, tamanho)) != -1) {
System.out.println(lidos);
saida.write(buffer, 0, lidos);
}
saida.flush();
System.out.println("Arquivo enviado!");
bis.close();
Você deve organizar um protocolo de comunicação.
Ou seja, definir o formato de uma série de mensagens, que permita que ambos os lados entendam o que está acontecendo.
Por exemplo, você poderia dizer que a mensagem 1 do seu protocolo tem a seguinte estrutura.
Tipo: Um inteiro indicando o valor 1, que significa enviar arquivo (assim vc pode diferenciar entre as várias mensagens na sua comunicação).
Tamanho e nome do arquivo (codificado em UTF-8): Observe que sem o tamanho, você também não saberia onde o nome começa e onde ele termina.
Tamanho do arquivo: Um int, contendo quantos bytes precisam ser lidos
Dados do arquivo
O código do servidor ficaria mais ou menos assim:
[code]final int TIPO_ENVIAR_ARQUIVO = 1;
DataOutputStream saida = new DataOutputStream(socket.getOutputStream());
File arquivo = new File(nomeArquivo);
FileInputStream fis = new FileInputStream(arquivo);
saida.writeInt(TIPO_ENVIAR_ARQUIVO);
saida.writeUTF(nomeArquivo); //A função já envia o tamanho automaticamente
saida.writeInt(file.length());
int tamanho = 4096; // buffer de 4KB
byte[] buffer = new byte[tamanho];
int lidos = -1;
while ((lidos = fis.read(buffer, 0, tamanho)) != -1) {
System.out.println(lidos);
saida.write(buffer, 0, lidos);
}
saida.flush();
[/code]
Observe que agora, basta que o cliente leia os dados em ordem. Você pode usar um DataInputStream. Assim você saberá exatamente quantos bytes deve ler e qual nome de arquivo será gerado do outro lado da conexão.
DataInputStream entrada = new DataInputStream(socket.getInputStream());
fos = new FileOutputStream(arquivoBaixar);
long tamanhoArquivo = entrada.readLong();
int tamanho = 4096; // buffer de 4KB
int totalLido = 0;
byte[] buffer = new byte[tamanho];
while(tamanhoArquivo > 0)
{
totalLido = entrada.read(buffer, 0, tamanho);
fos.write(buffer, 0, totalLido);
tamanhoArquivo = tamanhoArquivo - totalLido;
System.out.println(tamanhoArquivo);
}
Aqui está o jeito que eu fiz pra resolver o problema (Declarei o tamanho do arquivo como long para aceitar maiores arquivos)