Java ObjectInputStream传输对象ClassCastException异常排查及线程终止咨询
- 项目代码仓库:RCProject
- 项目结构参考图:Eclipse包管理器中展示的类结构
备注:目前对GitHub操作不熟悉,暂未完成所有类文件的正确上传。
开发与复现说明
- 开发环境基于VMware搭建,当前触发的报错不需要多PC/多VM环境即可复现
- 项目基础逻辑:服务端从
InitHandler类接收ClientInformation对象,随后启动两个客户端的匹配流程,当前迭代暂不实现安全相关逻辑 - 问题复现步骤:
- 先启动完成所需配置的“服务端”
- 切换到“受控客户端”模式,填入要求的信息后尝试向服务端发送数据,触发报错
- 已通过公开搜索排查解决方案,始终未定位到错误根源
触发报错的代码实现
Server.ServerInitializer类的完整代码:
package Server; import java.io.IOException; import java.io.ObjectInputStream; import java.net.ServerSocket; import java.net.Socket; public class ServerInitializer extends Thread { private int port; private ClientInformation[] ci = null; private ClientInformation c = null; private boolean run = true; ServerSocket serversocket; ObjectInputStream ois; Socket client; public ServerInitializer(int port, int clientlimit) { this.port = port; ci = new ClientInformation[clientlimit]; start(); } @Override public void run() { try { serversocket = new ServerSocket(port); while(run) { client = serversocket.accept(); System.out.println("New Client Has Been Connected, ip:" + client.getInetAddress().getHostAddress()); ois = new ObjectInputStream(client.getInputStream()); c = (ClientInformation) ois.readObject(); new ServerThread(ci,c, client, run); } serversocket.close(); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } public void terminate() { this.run = false; } public boolean getrun() { return run; } }
报错堆栈
Exception in thread "Thread-0" java.lang.ClassCastException: class Startup.ClientInformation cannot be cast to class Server.ClientInformation (Startup.ClientInformation and Server.ClientInformation are in unnamed module of loader 'app') at Server.ServerInitializer.run(ServerInitializer.java:35)
待解决的问题
- 如果目前提供的信息不足以定位错误,需要补充哪些内容?
- 如何通过现有
terminate函数,终止其他类/线程中正在运行的所有while循环?当前写的实现是否足够?这部分逻辑后续会同时应用在服务端和客户端模块,目前因为上述类转换报错还没有完成这部分功能的测试。
内容的提问来源于stack exchange,提问作者Sea Haron
相关产品推荐
相关产品推荐

