2017-09-21 6 views
1

J'ai développé un logiciel pour envoyer des fichiers via une connexion TCP/IP en utilisant Java Sockets. Le programme compile, cependant, l'application serveur lance une exception de distribution de classe et les fichiers ne sont pas envoyés au serveur. Toute personne qui pourrait m'aider, je serais très reconnaissant. est au-dessus du code suivant:Java Socket ClassCast Exception

classe serveur:

package filesender; 

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

public class ServidorTCP { 

public static void main(String[] args) 
     throws IOException, UnknownHostException { 

    try (ServerSocket socketServer = new ServerSocket(6789)) { 
     Socket socket = socketServer.accept(); 
     System.out.println("Conexão realizada com o cliente na porta 6789"); 

     byte[] objectAsByte = new byte[socket.getReceiveBufferSize()]; 
     BufferedInputStream bf = 
       new BufferedInputStream(socket.getInputStream()); 
     bf.read(objectAsByte); 

     Arquivo arquivo = (Arquivo) getObjectFromByte(objectAsByte); 

     String dir = arquivo.getDiretorio() + "\\" + arquivo.getNome(); 
     System.out.println("Criando o arquivo: " + dir); 

     try (FileOutputStream fos = new FileOutputStream(dir)) { 
      fos.write(arquivo.getConteudo()); 
     } 
    } 
} 

private static Object getObjectFromByte(byte[] objectAsByte) { 
    Object obj = null; 
    ByteArrayInputStream bis = null; 
    ObjectInputStream ois = null; 

    try { 
     bis = new ByteArrayInputStream(objectAsByte); 
     ois = new ObjectInputStream(bis); 
     obj = ois.read(); 

     bis.close(); 
     ois.close(); 
    } catch (IOException e) { 

    } 
    return obj; 
    } 
    } 

classe Client

package filesender; 

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

public class ClienteTCP { 

public static Arquivo arquivo; 
private static final long serialVersionUID = 1L; 


public static void main(String[] args) 
     throws IOException, UnknownHostException { 

    selectFile(); 

    try (Socket clientSocket = new Socket("127.0.0.1", 6789)) { 

     try (BufferedOutputStream bf = 
       new BufferedOutputStream(clientSocket.getOutputStream())) { 
      byte[] bytea = serializeFile(); 
      bf.write(bytea); 
      bf.flush(); 
     } 
    }  
} 

private static void selectFile() {  
    try { 
     File file = new File("C:\\Users\\DeveloperEng\\Documents\\" 
       + "teste\\arquivo.txt"); 
     byte[] bFile = new byte[(int) file.length()]; 
     try (FileInputStream fis = new FileInputStream(file)) { 
      fis.read(bFile); 
     } 


     arquivo = new Arquivo(); 
     arquivo.setConteudo(bFile); 
     arquivo.setNome("teste.txt"); 
     arquivo.setDiretorio("C:\\Users\\DeveloperEng\\Documents"); 
    } catch (IOException e) { 

    }  
} 

private static byte[] serializeFile() { 
    ByteArrayOutputStream bao = null; 
    ObjectOutputStream ous = null; 
    try { 
     bao = new ByteArrayOutputStream(); 
     ous = new ObjectOutputStream(bao); 
     ous.writeObject(arquivo); 
     //return bao.toByteArray(); 
    } catch (IOException e) { 

    } 
    return bao.toByteArray(); 
    } 
} 

classe File

package filesender; 

import java.io.*; 

public class Arquivo implements Serializable { 
    private String nome; 
    private byte[] conteudo; 
    private String diretorio; 

    private static final long serialVersionUID = 1L; 

    public String getNome() { 
     return nome; 
    } 

    public void setNome(String nome) { 
     this.nome = nome; 
    } 

    public byte[] getConteudo() { 
     return conteudo; 
    } 

    public void setConteudo(byte[] conteudo) { 
     this.conteudo = conteudo; 
    } 

    public String getDiretorio() { 
     return diretorio; 
    } 

    public void setDiretorio(String diretorio) { 
     this.diretorio = diretorio; 
    } 
} 

Exception lancée par l'IDE:

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to filesender.Arquivo 
at filesender.ServidorTCP.main(ServidorTCP.java:20) 
C:\Users\DeveloperEng\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1 
FALHA NA CONSTRUÇÃO (tempo total: 5 segundos) 
+1

Veuillez ajouter la pile de l'exception. – Berger

+0

Avez-vous passé par [ClassCastException] (https://stackoverflow.com/questions/907360/explanation-of-classcastexception-in-java)? – nullpointer

Répondre

1

S'il vous plaît, voir la ligne 20 de la classe ServidorTCP. Vous ne pouvez pas convertir la valeur renvoyée par la méthode "getObjectFromByte" en "Archivio", car elle n'est pas de type compatible. En particulier, c'est un entier. Cela se produit car la méthode read de ObjectInputStream renvoie un int (See Javadoc).

+0

Merci beaucoup. Je n'ai pas remarqué que la méthode read renvoie un int. Maintenant, j'ai mis en place une façon différente de lire le fichier et cela fonctionne correctement. –

+0

Vous êtes les bienvenus! –