Primeiro quero dizer que já pesquise pelo fórum e não encontrei nada que me ajudasse com meu problema.
O problema é o seguinte, tenho dois programas, um cliente e um servidor. O cliente envia para o servidor o nome do arquivo que ele quer e o servidor envia esse arquivo para ele. Estou usando sockets e não consigo fazer essa transferência de arquivos. Já consegui fazer com que o servidor envie o nome dos arquivos para o cliente, mas não teve jeito de fazer ele enviar o arquivo (é só um arquivo de cada vez).
Qual o problema que você está tendo em enviar os arquivos para o cliente?? Seja mais específico…
[]'s.
U
user99
O problema é que eu não sei como fazer para enviar um arquivo, não tenho nem idéia :lol:
Eu vi alguns exemplos mas cada um faz de um jeito diferente e o que eu tentei não deu certo, qual tipo de variáveis eu tenho que usar? Vi sobre FileInputStream, FileOutputStream, mas não sei como usá-las, envia um arquivo inteiro ou tem que ler os bytes e depois enviá-los? São várias dúvidas, preciso saber como começar…
kaique
Uma solução que é bastante simples é usar FileInputStream. Você pode fazer assim:
Agora, você pode usar o método available() para saber quantos bytes o seu arquivo tem. Depois disso, você cria um array de bytes com o tamanho que você acabou de descobrir.
Agora, você passa esse array no método read(byte[] b). Dessa forma você acabou de ler todos os bytes que formam o seu arquivo.
Agora você pode usar o OutputStream do Socket que você criou e passar os bytes que você acabou de ler. Assim você acabou de transferir um arquivo de um socket para outro.
Para finalizar o processo, basta você ler o InputStream do ServerSocket da mesma forma que você leu o FileInputStream no cliente.
Sacou??
[]’.
U
user99
Opa, valeu kaique, agora acho que estou progredindo.
Então vamos lá. No servidor que vai enviar o arquivo o código ficou assim:
//str2 é o nome do arquivoFileInputStreamfileIn=newFileInputStream("C/Compart/"+str2);byte[]serverBuffer=newbyte[fileIn.available()];in.read(serverBuffer);out.write(serverBuffer);
é isso mesmo? e no client pra receber o arquivo eu apenas recebi a variável serverBuffer, mas não entendi como faço pra “montar” o arquivo.
kaique
No outro lado, basta você ler todos os bytes que você escreveu no outro Socket. Assim, você terá o mesmo array de bytes novamente.
Depois, basta você instanciar um FileOutputStream passando como argumento o local onde você deseja criar o arquivo. Depois basta passar o array de bytes para o método write(byte[] b) que o arquivo será criado.
[]'s.
Paulo_Silveira
user 99, o problema dessa abordagem é que voce esta criando um array temporario em memoria com todo o conteudo do arquivo. se o arquivo for grande, voce tera probelmas. uma abordagem mais itneressante é voce ir lendo de pouco em pouco, a medida que esta enviando pela socket.
U
user99
Obrigado pela ajuda pessoal, to quase lá…
Ali no meu código, aquele in.read(serverBuffer); ta certo? O in é uma variável do DataInputStream, ou ela deveria ser chamada pelo fileIn?
E Paulo, como eu deveria fazer então pra ficar melhor? Um while e ir mandando de pouquinho?
kaique
Quase lá, agora basta trocar o Inputstream que você está lendo.
Olá de novo, a parte do servidor ta feita, agora só falta conseguir ler o arquivos, estou fazendo a mesma coisa, o out.write(serverBuffer); estou lendo no cliente como int, ai crio um vetor de bytes com esse valor que recebi, dou um fileOut.write passando como parâmetro o vetor de bytes… é isso mesmo ou to esquecendo algo?
kaique
Cara, não entendi muito bem o que você escreveu.
Seguinte, se a parte feita no servidor está dando certo, no cliente você vai usar a mesma idéia. A diferença é que no momento que você for ler os bytes, você vai ler do InputStream do Socket, assim você vai ler o que foi escrito do outro lado. Depois de ler os bytes, basta criar um FileOutputStream, e passar o array de bytes para o método write(byte[] b).
Sacou?
[]'s.
U
user99
Blz, agora sim, estou conseguindo enviar arquivos .txt, mas qualquer outro tipo de arquivo chega corrompido, alguma idéia?
kaique
Cara, alguma coisa esquisita você está fazendo. Já reparou se os arquivos texto são criados do outro lado perfeitamente igual? Olhou o texto de dentro se realmente tudo está escrito corretamente? Não sei como você testou isso, mas tenta fazer o teste com arquivos grandes de texto, para facilitar essa verificação.
A princípipo, se funciona com arquivos texto, funciona com qualquer outro tipo de arquivo (pdf, vídeo, música, etc…)
[]'s.
U
user99
O pior é que é isso mesmo, o .txt passa certinho, mas já um .pdf por exemplo vem corrompido. Vou colocar aqui o código do meu cliente.
Bom, pelo que andei lendo esse problema de arquivo corrompido é por causa dos métodos write e read… pelo que entendi deveria usar um Buffered. Alguém saberia me dizer se é isso mesmo e como eu uso ele?
Perceba que a chamada “in.read(bufferClient);” NÃO dá garantia de que o vetor de bytes bufferClient irá ser totalmente preenchido, mas pode-se saber quandos bytes foram lidos nessa chamada de método pelo retorno que o “in.read(bufferClient);” dá. Sugiro que você crie um loop que vá lendo até preencher todo o “bufferClient”, e que se leia usando o “InputStream.read(byte[] buf, int off, int len);” nesse loop.
Acho que isso deve ajudar.
Inté.
Inté.
paulofernandesjr
uam duvida!
este é um processo para UpLoad ou de DownLoad ???
abraço
U
user99
paulo, o servidor faz upload e o cliente faz o download.
E ainda não consegui fazer funcionar, daquele primeiro jeito que fiz ele apenas envia arquivos .txt, pelo que eu vi não posso usar métodos write e read (li em outro tópico isso), e tenho que usar o buffered ou InputStream, OutputStream, mas não estou conseguindo fazer funcionar. Vou colocar aqui o último código que usei:
que o cliente faz download e o servidor recebe o upload isso eu sei,
queria saber qual a sua dúvida se é em um ou no outro…
eu também estou querendo fazer o upload de um arquivo, mas não sei por onde começar
abraço
U
user99
A dúvida é nos dois, acho que as duas partes estão erradas no meu código. Nesse código que postei no post anterior ele da pau no BufferedOutputStream inBuff…
paulofernandesjr
posta o erro!
U
user99
quando eu estou debugando o código ele pára naquela linha, mas não me da erro nenhum.
U
user99
Bom, finalmente consegui fazer o programa funcionar, encontrei uns exemplos na internet e agora está funcionando.
Mas ainda tenho uma dúvida, posso utilizar DataInputStream e BufferedInputStream no mesmo código? Porque eu utilizo o DataInputStream para receber strings e o BufferedInputStream para receber o arquivo,o problema é que antes de declarar o Buferred eu recebo as strings normalmente e depois do Buffered não consigo mais receber as strings com o DataInputStream… não sei se deu pra entender, se ficou muito enrolado me digam…
paulofernandesjr
posta o seu codigo que o pessoal te ajuda!
eu particularmente não entendi!
hehe
U
user99
É mais ou menos assim:
...DataOutputStreamout=newDataOutputStream(client.getOutputStream);DataInputStreamin=newDataInputStream(client.getInputStream);out.writeUTF("START");Stringstr=in.readUTF();// aqui ele lê e envia a string normalmente...BufferedInputStreambis=newBufferedInputStream(client.getInputStream());// aqui fica o código que recebe o arquivostr=in.readUTF();// aqui ele não consegue mais ler as strings recebidas.
O
orhigor
manda o codigo todo pra gente dar uma olhada, são 3 classes né?!