Socket, transmissão de Strings + arquivos

Minha intenção é através de socket transmitir arquivos de uma máquina para
outra, porém estou encontrando dificuldades no que diz respeito a capturar
da classe que envia o arquivo, o destino (pasta) na qual o arquivo deverá
ser transferido, ou seja, dentro do fluxo recebido não vejo uma solução
para separar a mensagem com a String contendo o nome da pasta e em seguida
o fluxo de bytes contendo o arquivo em si.
A utilização de socket é uma opção visando a segurança em função do método utilizado para transmissão através de um IP fixo e uma porta randômicamente gerada pela API.
Seguem meus códigos:

import java.io.;
import java.util.zip.
;
import java.net.Socket;

// uso: java Tr <endereco ip destino>
public class Tr {
public static void main(String[] args) throws IOException {

  Socket s = null;
  s = new Socket(args[1], 7000);

  FileInputStream in = new FileInputStream(args[0]);
  BufferedOutputStream out = new

BufferedOutputStream(s.getOutputStream());

  byte b[] = new byte[1024];
  int nBytes;
  System.out.println(b);
  while ((nBytes = in.read(b, 0 , b.length)) != -1) {
     out.write(b, 0, nBytes);
     System.out.println("Tr=" + nBytes);
  }
  System.out.println("Arquivo transferido...");
  in.close();
  out.close();
  s.close();

}
}

import java.io.;
import java.util.zip.
;
import java.net.ServerSocket;
import java.net.Socket;

//uso: java Simp <driveDestino:pastaDestinoarquivo>
public class Simp {
public static void main(String[] args) throws IOException {
String nomearq = new String("");
String destino = new String("");

  ServerSocket serv = null;

  Socket s = null;
  BufferedReader entrada = null;
  serv = new ServerSocket(7000);


   System.out.println("Aguardando transmissao... ");
    s = serv.accept();
    System.out.println("Connection accepted: "+ s);


      BufferedInputStream in = new

BufferedInputStream(s.getInputStream());
BufferedOutputStream out = new BufferedOutputStream(new
FileOutputStream(new File(args[0])));

  byte bServer[] = new byte[1024];
  int nBytesServer;
  while ((nBytesServer = in.read(bServer, 0, bServer.length)) != -1) {
     out.write(bServer, 0, nBytesServer);
            System.out.println("simp=" + nBytesServer);
  }
  System.out.println("Arquivo recebido...");
  s.close();
  serv.close();
  out.close();

}
}

Caso possua alguma sugestão a título de troca de informações, te agradeço.

Paulo Lincoln Ribeiro de Oliveira
Analista em Ciência e Tecnologia
IBGE/DI/COINF/GEASP
plincoln@ibge.gov.br
(21)2142-0584 (IBGE) :smiley:

Uma sugestão: use DataOutputStream e veja como gravar strings, ints e byte arrays em um data output stream.

Normalmente eu usaria um servidor ftp ou SFTP “mexido”, com um monte de regras (por exemplo, só atender em um determinado IP, só atender de um determinado IP, etc. ) Isso tudo pode ser obtido como open-source. Como você está no IBGE (órgão do governo), deve ter algum mago do open-source aí que pode configurar alguma coisa para você.

P.S. Cuidado … não deixe emails em formato legível na sua assinatura (a menos que o mail server do IBGE tenha um spam filter muito, muito bom… ) Normalmente a gente usa algo como “plincoln arroba ibge ponto gov ponto br”; o pessoal mais enjoado costuma pôr um bitmap de modo que uma pessoa consiga ler direitinho o endereço, mas não um programa automatizado.