Transferência de arquivos básica

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 :slight_smile:

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)