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?
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:
Filefoto=newFile(path);buffer=newbyte[(int)foto.length()];FileInputStreamfile=newFileInputStream(foto);BufferedInputStreamin=newBufferedInputStream(file);in.read(buffer,0,buffer.length);//Opcaooutput.writeInt(1);//nomeoutput.writeUTF(nome);//foneoutput.writeUTF(fone);//tamanho do array de bytesoutput.writeInt(buffer.length);//arquivooutput.write(buffer,0,buffer.length);System.out.printf("\n O arquivo foi enviado ao Servidor!");file.close();in.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:
InputStreamin=???//InputStream para receber o arquivoOutputStreamout=???//OutputStream para escrever o arquivobyte[]buffer=newbyte[64*1024];//Alocar um array do tamanho do arquivo a ser recebido//como buffer é loucura, pode esgotar a memória disponível facilmenteintlength=???//Tamanho do arquivointcopied;//Variáveis de suporteintreaded;intremaining;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!