Problema enviar arquivo com Socket

4 respostas
Jorgev

Pessoal, eu preciso enviar arquivos via socket, só que eu tou com o problema que toda vez que eu envio um arquivo eu tenho que fechar o cliente senão não consigo enviar outro.

Isso funciona assim mesmo ou tem alguma maneira de enviar e deixar o cliente aberto sempre?

Desde já obrigado.

4 Respostas

KWill

Isto me cheira a falta de protocolo de controle. Você provavelmente deve ter adaptado rapidamente algum código relacionado a I/O de transmissão/recebimento de arquivo para usar Sockets, parando a transferência de arquivo apenas quando os InputStream voltam -1 nos métodos de leitura ou quando alguma exceção é lançada.
Você precisa avisar de outras formas a ponta que está recebendo o arquivo que a transferência de arquivo terminou. Um exemplo é enviar o tamanho do arquivo a ser transferido antes de enviar os dados do arquivo, assim a ponta que recebe o arquivo poderá ler exatamente tantos bytes até que a transferência esteja completa, evitando que você tenha que fechar as pontas da conexão.

Inté.

Jorgev
meu método de enviar é este:
File foto = new File (path);
			buffer = new byte[(int)foto.length()];
			
			FileInputStream file = new FileInputStream (foto);
			BufferedInputStream in = new BufferedInputStream(file);
			
			in.read(buffer,0,buffer.length);

			//Opcao
			output.writeInt(1);
			//nome
			output.writeUTF(nome);
			//fone
			output.writeUTF(fone);

			//tamanho do array de bytes
			output.writeInt(buffer.length);
			//arquivo
			output.write(buffer,0,buffer.length);
			
			System.out.printf("\n O arquivo foi enviado ao Servidor!");
			
			file.close();
			in.close();
e o de receber é este:
tamanhoArquivo = input.readInt();
	    	
	    	byte [] bytearray  = new byte [tamanhoArquivo + 100];
	  	    
	  		DataOutputStream arquivo = new DataOutputStream (new FileOutputStream(diretorio + codigo + fim));
	  		BufferedOutputStream out = new BufferedOutputStream(arquivo);
	  		
	  		bytesLidos = input.read(bytearray,0,bytearray.length);
	  		marcador = bytesLidos;
	  		
	  		//pega o ponto onde o array de bytes está preenchido
	  	    do {
	  	       bytesLidos =
	  	          input.read(bytearray, marcador, (bytearray.length - marcador));
	  	       if(bytesLidos >= 0) marcador += bytesLidos;
	  	    } while(bytesLidos > -1);
	  		
	  	    //escreve até onde o marcador de fim
	  	    out.write(bytearray, 0 , marcador);
	  	    out.flush();
	  	    out.close();

eu tou passando um inteiro com o tamanho arquivo no inicio. mas quando eu preciso enviar outro arquivo eu tenho que abrir novamente o cliente se não fizer isso o botao fica travado.

KWill

Olhando agora, percebo que há protocolo de controle, mas o mesmo tá me parecendo bugado.
Eis um exemplo adaptado do meu multiplexador de streams em Java:

InputStream in = ??? //InputStream para receber o arquivo
OutputStream out = ??? //OutputStream para escrever o arquivo
byte[] buffer = new byte[64 * 1024]; //Alocar um array do tamanho do arquivo a ser recebido
//como buffer é loucura, pode esgotar a memória disponível facilmente
int length = ??? //Tamanho do arquivo
int copied; //Variáveis de suporte
int readed;
int remaining;
if (length > 0)
{
	copied = 0;
	readed = 0;
	remaining = length;
	while (copied < length)
	{
		readed = in.read(buffer, 0, Math.min(remaining, buffer.length));
		if (readed != -1)
		{
			out.write(buffer, 0, readed);
			out.flush();
			copied += readed;
			remaining -= readed;
		}
		else
		{
			break;
		}
	}
	in.close();
	out.close();
}

Talvez ajude.

Inté.

dionat4n

KWill teu código me ajudou bastante, eu estava com um bug na transmissão dos arquivos que não tinha me ligado!

Valeu!

:smiley:

Criado 10 de junho de 2009
Ultima resposta 22 de jun. de 2009
Respostas 4
Participantes 3