Transferir arquivos via Socket

Pessoal,

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

Valeu…

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…

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

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.

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

Abraço.

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.

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!

google: java list files

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

grato!

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…

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…

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?

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

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.

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…