Dúvida com transferência de arquivo via socket

Pessoal boa noite,

Estou com um pequeno problema para tranferir arquivos via socket e gostaria da ajuda de vocês.
A transferência de arquivo está ocorrendo, mas o arquivo chega vazio no Cliente.
Estou transferindo do Server para o Client o arquivo teste.txt.
O código é o seguinte:

Cliente:

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

public class Client {

static public void main(String []args){
	
	try {
		
		Socket skt = new Socket("127.0.0.1",7000);
		DataOutputStream out = new DataOutputStream (new FileOutputStream("D:\\teste.txt"));
		DataInputStream in = new DataInputStream(skt.getInputStream());  	
	
		 byte bufferCli[];
		 bufferCli = new byte[in.available()];
		 while (in.read()!=-1) 
		   out.write(bufferCli); 
	
	}catch(Exception err){
		
	}
	
}

}

Server:

import java.io.;
import java.net.
;
public class Server {

public static void main(String[] args) {
	ServerSocket serv;
	Socket skt = null;

     try{
         
         serv = new ServerSocket(7000);
         skt = serv.accept();
         File arquivo = new File("C:\\teste.txt");
         DataInputStream in = new DataInputStream(new FileInputStream(arquivo));
         DataOutputStream out = new DataOutputStream(skt.getOutputStream());
         
         byte[] cache = new byte[10240];
         int size = 0;
         while ((size = in.read(cache)) > -1) {
         	out.write(cache, 0, size);
         }
         
         skt.close();
         
         //in.close();
         //out.close();
         //skt.close();
         
     //Trata possíveis exceções
     }catch(IOException e){
         
         System.out.println("Algum problema ocorreu ao criar ou enviar dados pelo socket." + e.getMessage());
     
     }finally{
         
     
     }

}

}

Vc podia tentar utilizar as tags code.

Veja esse fragmento de codigo

bufferCli = new byte[in.available()]; while (in.read()!=-1) out.write(bufferCli);

enquanto vc lê o DataInputStream vc escreve bufferCli. Em nenhum momento bufferCli recebe alguma coisa do DataInputStream, logo vc está imprimindo “nada”.

peczenyj obrigado pela resposta.

Mas como eu poderia resolver isso então?

É a primeira vez que preciso de utilizar socket, por isso estou num pouco perdido.

Obrigado
Allex

Mude para isso:

bufferCli = new byte[in.available()]; int readByte = in.read(); while (readByte !=-1) { out.write((byte)readByte); readByte = in.read(); }

ViniGodoy obrigado pela resposta.

Mas está dando erro na 5ª linha do seu código:

bufferCli = new byte[in.available()]; int readByte = in.read(); while (readByte !=-1) { out.write((byte)readByte); byte = in.read(); <<<---- ERRO AQUI }

Corrigido.

ViniGodoy , desculpe a insistência, mas ainda da erro na primeira linha

bufferCli = new byte[in.available()]; //<<<----ERRO int readByte = in.read(); while (readByte !=-1) { out.write((byte)readByte); readByte = in.read(); }

Ajuda se você dizer que erro foi, ou colar a exceção aqui.
Você mesmo não consegue corrigir?

O código ali era ilustrativo. Acostume-se com isso aqui. Geralmente a gente põe um código para mostrar o caminho para resolver seu problema, mas poucos vão criar um projeto, escrever o código, compilar, testar e te dar um 100% funcional.

É provável que você tenha que declarar a variável bufferCli.
byte[] bufferCli = new byte[in.available()];

Aliás, esse código nem sequer é meu… mas seu… dá uma olhada no que você postou ali em cima e você vai ver que essa linha é idêntica a que você já tinha! Será que você não apagou a declaração no copy&paste?

Aproveitando o tópico…
estou com um probleminha também, dem uma olhada no seguinte código:

[code]package modelo;

import controle.Controlador;
import …

public class Cliente implements Runnable{

private DatagramSocket cliente;
private DatagramPacket pacote;
private byte[] dado;

private Controlador controlador;

public Cliente() {
    controlador = new Controlador();       
    try {  
        cliente = new DatagramSocket();
    } catch (SocketException ex) {
        ex.printStackTrace();
    }
}

public void envia(String mensagem, String ip, int porta) {       
    
    dado = mensagem.getBytes();
    try {                                
            pacote = new DatagramPacket(dado, dado.length, InetAddress.getByName(ip), porta);                
            cliente.send(pacote);                
            
    } catch (UnknownHostException ex) {              
        ex.printStackTrace();
        
    } catch (IOException ex) {              
        ex.printStackTrace(); 
        
    }          
    
}

public String recebe() {
    String resposta = null;
    dado = new byte[100];
    pacote = new DatagramPacket(dado, dado.length);
    
    try {            
        cliente.setSoTimeout(5000);            
        cliente.receive( pacote ); 
        resposta = "ok";
        resposta = new String(pacote.getData(), 0, pacote.getLength());
    } catch (IOException ex) {
        resposta = "not ok";
        ex.printStackTrace();
    }                
    return resposta;
}

public void run() {
}    

}[/code]

Trabalhando com o padrão MVC, eu tenho uma classe de controle no pacote do controlador, ai está a classe:

[code]package controle;
import visao.Tela;
import modelo.Cliente;
import modelo.Servidor;

public class Controlador {
static Tela tela;
static Cliente cliente;
static Servidor servidor;

boolean terminal;
static String email;
static String assunto;
static int ip1;
static int porta;


public Controlador() {
    
}


public static void main(String args[]){
    tela = new Tela();
    tela.setVisible(true);
    
    while(true){
        if(tela.getConectaCli() == true){
            tela.setConectaCli(false);
            new Thread(cliente).run();
            cliente.envia("a",1,1);//esse método envia string, int, int.

//por que esse método não pode ser chamado aqui? ele dá um erro
//e pede pra cria-lo na classe cliente sendo que ele já existe!

        }
        if(tela.getConectaSer() == true){
            tela.setConectaSer(false);
            new Thread(servidor).start(); 
        }
    }
}//fim do main.

private static String getEmail(){
    return email = tela.getEmail();
}

private static int getIp1(){
    return ip1 = tela.getIp1();
}

private static int getPorta(){
    return porta = tela.getPorta();
}

}
[/code]

Gente por favor desculpem minha falta de atenção… :wink:

ViniGodoy obrigado,

Consegui resolver o problema.
Agora está funcionando.

Allex