当我尝试通过Java中的服务器套接字发送对象时,我收到了EOFException。
这是发送部分的代码:
public static void sendObject(Object Object, InetAddress IP, int Port){
try{
Socket receivingSocket = new Socket(IP, Port);
OutputStream OS = receivingSocket.getOutputStream();
ObjectOutputStream OOS = new ObjectOutputStream(OS);
OOS.writeObject(Object);
OOS.close();
OS.close();
receivingSocket.close();
}
catch(Exception e){
System.err.println("Failed to send object to: " + IP + " on port: " + Port);
System.err.println(e);
}
}
我尝试将对象强制转换为特定对象但不起作用。 问题实际上出现在接收方看起来像这样:
public Downloader(int PortStart, int PortStop, Loading_State loading_state){
this.loading_state = loading_state;
for(int i = PortStart;i<PortStop;i++){
try {
SS = new ServerSocket(i);
break;
}
catch (Exception e) {
e.printStackTrace();
}
}
}
public void run(){
try {
S = SS.accept();
IS = S.getInputStream();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
while(!destroy){
while(active){
try {
OIS = new ObjectInputStream(IS);
Character Char = (Character)OIS.readObject();
loading_state.setChar(Char);
pause();
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
因此,当我启动下载时,控制台立即吐出:
java.io.EOFException
at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(Unknown Source)
at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
at java.io.ObjectInputStream.<init>(Unknown Source)
at input_output.network.Downloader.run(Downloader.java:68)
编辑:该对象确实实现了Serializeable
public class Character implements Serializable{
private static final long serialVersionUID = -6390272842934614484L;
BIG EDIT!:
我不知道为什么或如何,但我认为下载工作但现在它无法将收到的对象强制转换为我的对象!
Character Char = (Character)OIS.readObject();
java.lang.ClassCastException: server.database.account.Character cannot be cast to database.Character
任何想法为什么?
答案 0 :(得分:1)
您的对象是否可序列化?该对象应该实现可序列化的接口:
class MyClass implements Serializable {
}
答案 1 :(得分:0)
您只发送一个对象,但您正在循环期望读取多个对象。这没有意义。要么发送更多的对象,要么只读取一个。如果您发送和读取多个对象,当您阅读的内容超过发送时,您将始终获得EOFException。
答案 2 :(得分:-1)
两件事,
由于它的无限循环可以收集空输入,你也应该处理它。
public void run(){
while(!destroy){
while(active){
try{
S = SS.accept();
IS = S.getInputStream();
if(IS!=null && IS.available()>0){
OIS = new ObjectInputStream(IS);
Character Char = (Character)OIS.readObject();
loading_state.setChar(Char);
pause();
}
}
catch(Exception e){ ..}
}
}
}
答案 3 :(得分:-1)
我解决了!
第一个问题是我在开始线程下载的同时发送了一个请求(我想)所以我做的是我稍后发送请求,突然EOF facepalm异常消失了......
现在我还有转换异常了,问题是我必须在与发件人原因完全相同的包层次结构中拥有类(对象)字符,因为java是愚蠢的。
感谢您的帮助!