2017-09-21 5 views
1

Ich habe eine Software zum Senden von Dateien über TCP/IP-Verbindung mit Java Sockets entwickelt. Das Programm kompiliert jedoch die "Server-Anwendung" wirft eine Class Cast-Ausnahme und die Dateien werden nicht an den Server gesendet. Wer mir helfen könnte, dem wäre ich sehr dankbar. Oben ist der folgende Code:Java Socket ClassCast Ausnahme

Server-Klasse:

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

Client-Klasse

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

File-Klasse

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; 
    } 
} 
von der IDE 0

Ausnahme ausgelöst:

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

Fügen Sie den Stacktrace der Exception hinzu. – Berger

+0

Haben Sie [ClassCastException] (https://stackoverflow.com/questions/907360/explanation-of-classcastexception-in-java) durchlaufen? – nullpointer

Antwort

1

Bitte, die Zeile 20 der ServidorTCP-Klasse. Sie können den von der Methode "getObjectFromByte" zurückgegebenen Wert nicht in ein "Archivio" umwandeln, da dieser nicht kompatibel ist. Insbesondere ist es ein Integer. Es passiert, weil die Lese-Methode des ObjectInputStream einen Int (See Javadoc) zurückgibt.

+0

Vielen Dank. Ich habe nicht bemerkt, dass die Methode read ein int zurückgibt. Jetzt habe ich einen anderen Weg, um die Datei zu lesen und es funktioniert richtig eingestellt. –

+0

Gern geschehen! –