Transferir arquivos via Socket

14 respostas
R

Pessoal,

Alguém tem alguma documentação sobre transferência de arquivos via Socket???

Valeu…

14 Respostas

T

vc quer algo pronto ou tem alguma duvida em especial?
nos tutoriais do guj tem um sobre socket e outro sobre manipulacao de arquivo… juntando os dois eh relativamente simples fazer transferencia de arquivo via socket…

L

cara dá uma olhada na documentação do java ou mesmo em arquivos por aí sobre Streams de Bytes
:smiley:

P

Vc pode transferir bytes mas o ideal é vc utilizar sobre o tcp-ip um protocolo para facilitar a sua vida.

Um exemplo de protocolo é o FTP.

D

MAis na pratica como faço??? :roll:

Abraço.

G

Existem várias formas, há até frameworks para transferência de “objetos” de forma direta. Mas pode enviar via array de bytes mesmo. Apresento duas classes uma para servidor e outra cliente.

import java.net.*;
import java.io.*;

public class FileServer {
  public static void main (String [] args ) throws IOException {
    // cria o nosso socket
    ServerSocket servsock = new ServerSocket(13267);
    while (true) {

      Socket sock = servsock.accept();
      System.out.println("Conexão aceita: " + sock);

      // envia o arquivo (transforma em byte array)
      File myFile = new File ("meuArquivo.pdf");
      byte [] mybytearray  = new byte [(int)myFile.length()];
      FileInputStream fis = new FileInputStream(myFile);
      BufferedInputStream bis = new BufferedInputStream(fis);
      bis.read(mybytearray,0,mybytearray.length);
      OutputStream os = sock.getOutputStream();
      System.out.println("Enviando...");
      os.write(mybytearray,0,mybytearray.length);
      os.flush();
      sock.close();
      }
    }
}

Vamos agora receber o nosso arquivinho

import java.net.*;
import java.io.*;

public class FileClient{
  public static void main (String [] args ) throws IOException {
    int filesize=6022386;

    long start = System.currentTimeMillis();
    int bytesRead;
    int current = 0;
    Socket sock = new Socket("127.0.0.1",13267);

    // recebendo o arquivo
    byte [] mybytearray  = new byte [filesize];
    InputStream is = sock.getInputStream();
    FileOutputStream fos = new FileOutputStream("source-copy.pdf");
    BufferedOutputStream bos = new BufferedOutputStream(fos);
    bytesRead = is.read(mybytearray,0,mybytearray.length);
    current = bytesRead;

    do {
       bytesRead =
          is.read(mybytearray, current, (mybytearray.length-current));
       if(bytesRead >= 0) current += bytesRead;
    } while(bytesRead > -1);

    bos.write(mybytearray, 0 , current);
    long end = System.currentTimeMillis();
    System.out.println(end-start);
    bos.close();
    sock.close();
  }
}

Veja se dessa forma possa atender a sua necessidade, e tente codar também, assim poderemos melhor tirar dúvidas.

T

Pegando o embalo aqui da duvida. Como seria para fazer uma listagem dos diretorios do servidor, para que eu possa escolher o que fazer download???
Porfavor mostre ai em codigo.
Desde já eu agradeço!

D

google: java list files

W

Amigo, como tranferir esse arquivo via UDP (DatagramSocket e PacketSocket)?

grato!

E

Sobre o código do colega acima, é importante observar algumas coisas…Ele carrega para a memória todo o arquivo antes de transferir. Caso você esteja implementando um servidor que ouça trocentas requisições “paralelas”, dependendo do tamanho dos arquivos que você vai transferir essa abordagem vai comer sua memória e provavelmente vai deixar seu servidor na mão…Se for um cenário single-thread até não vejo problemas. Mas se o seu caso se enquadra no cenário que delineei seria interessante você transmitir o arquivo em blocos. Assim que le um bloco específico do arquivo, já o envia via socket e do outro lado, recebe o bloco do socket e, em seguida, escreve no arquivo…Meter tudo na memória às vzes é problemático…

P

Mas,
sei não…

Vai depender da aplicação, lógico…
Dai o cara da dúvida vai ter que analisar a necessidade dele e adaptar para o que quer…

Dependendo FTP mesmo direto seria melhor…
Dependendo uma simples fragmentação do arquivo já mata a pau…

Vai depender do problema do cara…

Pra mim… foi um bom exemplo de como jogar a bolinha dum lado da rede e pegar do outro…

M

Pessoal, tentei fazer a transferência como mostrado acima, porém o arquivo que foi criado tem 0 bytes,

eu estou tentando trabalhar com arquivos mp3, será que ele faz a cópia do arquivo igual?

M

Desculpem, problema resolvido…(distração minha…)

M

Procura pela API Java NIO que tem algumas facilidades com arquivos… são os FileChannels e SocketChannels… Mas não sei muito do assunto e não consigo te explicar.

G

pessoal, vocÊs que são feras em socket… Eu queria tirar uma dúvida…

o que são sockets??? tipo… em que camada roda? já que usa a rede, usa um protocolo, certo? que protocolo é esse? eu não sei se essas perguntas são relevantes, mas é que me deixam meio confuso ainda…

Criado 10 de julho de 2006
Ultima resposta 23 de abr. de 2010
Respostas 14
Participantes 14