1

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)
2
  • 1
    Please add the exception's stacktrace. Commented Sep 21, 2017 at 12:05
  • Did you go through ClassCastException? Commented Sep 21, 2017 at 12:06

1 Answer 1

1

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

Sign up to request clarification or add additional context in comments.

1 Comment

Thank you very much. I didn't noticed that the read method returns an int. Now I've setted a different way to read the file and it's working properly.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.