Java 套接字 ClassCastException

Posted

技术标签:

【中文标题】Java 套接字 ClassCastException【英文标题】:Java Socket ClassCast Exception 【发布时间】:2018-03-02 18:40:08 【问题描述】:

我一直在开发一个使用 Java 套接字通过 TCP/IP 连接发送文件的软件。该程序编译,但是,“服务器应用程序”抛出一个类转换异常并且文件不会发送到服务器。任何可以帮助我的人,我将非常感激。以上是以下代码:

服务器类:

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;
   
  

客户端类

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


文件类

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;
      

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)

【问题讨论】:

请添加异常的堆栈跟踪。 你通过ClassCastException了吗? 【参考方案1】:

请参阅 ServidorTCP 类的第 20 行。 您不能将“getObjectFromByte”方法返回的值转换为“Archivio”,因为它不是兼容的类型。特别是,它是一个整数。 这是因为 ObjectInputStream 的 read 方法返回一个 int (See Javadoc)。

【讨论】:

非常感谢。我没有注意到 read 方法返回一个 int。现在我设置了一种不同的方式来读取文件并且它工作正常。

以上是关于Java 套接字 ClassCastException的主要内容,如果未能解决你的问题,请参考以下文章

java的套接字Socket问题

Socket套接字—Java套接字编程

Java - 使用 ObjectStream 发送套接字

Java 套接字:TCP 校验和不正确

Java,增加套接字超时

JAVA套接字在接受数据之前关闭