Search code examples
javasocketsserializable

Java Socket ClassCast Exception


I've been developing a software to send files through TCP/IP connection using Java Sockets. The program compiles, however, the 'Server Application' throws a Class Cast Exception and the files aren't sent to the server. Anyone who could help me, I would be very thankful. Above is the following code:

Server class:

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 class

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 class

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 thrown by the 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)

Solution

  • Please, see the row 20 of the ServidorTCP class. You can't cast the value that is returned by "getObjectFromByte" method to an "Archivio", because it is not of a compatible type. In particular, it is an Integer. It happens because the read method of the ObjectInputStream returns an int (See Javadoc).