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的主要内容,如果未能解决你的问题,请参考以下文章