Dúvida com transferência de arquivo via socket

10 respostas
A

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 <a href="http://java.io">java.io</a>.<em>;

import <a href="http://java.net">java.net</a>.</em>;

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{
         
     
     }

}

}

10 Respostas

peczenyj

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”.

A

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

ViniGodoy

Mude para isso:

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

A

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 }

ViniGodoy

Corrigido.

A

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(); }

ViniGodoy

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?

moacirjava
Aproveitando o tópico... estou com um probleminha também, dem uma olhada no seguinte código:
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() {
    }    

    
}
Trabalhando com o padrão MVC, eu tenho uma classe de controle no pacote do controlador, ai está a classe:
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();
    }
}
moacirjava

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

A

ViniGodoy obrigado,

Consegui resolver o problema.
Agora está funcionando.

Allex

Criado 16 de março de 2008
Ultima resposta 19 de mar. de 2008
Respostas 10
Participantes 4