2013-04-16 78 views
2

当我试图通过Java中的服务器套接字发送对象时,出现EOFException。阅读对象时出现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); 
    } 
} 

我试图铸造对象的特定对象,并没有奏效。 这个问题实际上在接收端,看起来像这样显示出来:

所以,当我开始下载控制台立刻吐出:

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编辑!:

我不知道为什么或如何,但我认为下载工作,但现在它不能将接收到的对象转换为我的对象!

Character Char = (Character)OIS.readObject(); 
java.lang.ClassCastException: server.database.account.Character cannot be cast to database.Character 

任何想法为什么?

+0

你看过这个问题吗? http://stackoverflow.com/questions/2666040/java-io-eofexception-while-writing-and-reading-froma-servlet – greenkode

+0

不要忘记刷新输出流。 – Erik

+2

'对象对象'rahhhhhh !!! – UmNyobe

回答

-1

我解决它!

第一个问题是我在发起线程下载(我认为)的同时发送了一个请求,所以我做的是稍后发送请求,突然EOF facepalm异常消失了。 。

现在我有了转换异常,并且问题在于我必须将类(对象)字符放在与发送者完全相同的包层次结构中,因为java是愚蠢的。

感谢您的帮助!

+0

EOFException不受更改时序影响。您必须修正其他问题,例如我的答案中提到的问题。 – EJP

1

对象是否可序列化?该对象应该实现可串行化接口:

class MyClass implements Serializable { 
} 
+1

欢迎来到堆栈溢出!这真的是一个评论,而不是一个答案。有了更多的代表,[你会能够发表评论](http://stackoverflow.com/privileges/comment)。现在我已经为你添加了评论,并且我将这个帖子标记为删除。 –

+0

如果这是他的问题,他会在发送时得到一个NotSerializableException这是一个接收到的EOFException -1 – EJP

0

您只发送一个对象,但您正在循环期望读取多个对象。这没有意义。发送更多的对象或只读取一个。如果您发送并读取多个对象,那么当您读取比发送的更多的对象时,您将始终收到EOFException。

+0

我应该多解释一下,在接收到一个对象之后,它在传递对象之前暂停下载器,然后继续下载另一个对象 –

+0

你发布的代码有缺陷我描述过,你的新代码有其他代码,你需要为每个接受的连接启动一个新的线程,以便开始使用 – EJP

-1

两件事情,

  1. While循环应该覆盖整个运行方法(我想是看到代码)
  2. 由于其无限循环,它可以收集空的投入,你应该处理为好。

    公共无效的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){ ..} 
        } 
    } 
    

    }

+0

if(IS!= null && IS.available()> 0)仅在一些情况下只出现一次,并且抛出了一个异常 –

+0

available()的正确用法很少,而且这不是其中之一。所有这些都会忽略没有写入对象*的流,并且也会泄漏它们。如果客户稍后发送,它将会丢失。另外'IS'永远不能为空,因此对它进行测试毫无意义。 -1 – EJP