outputStream shutdown导致其他Streams块?

时间:2013-11-06 11:00:04

标签: java objectoutputstream

我有一台拥有许多客户端的服务器..每个连接都到达服务器

如果它被接受,我将它发送给一个帖子:

server= serverSocketcht.accept();
new ThrdConv(server).start(); 
在ThrdConv线程中的

我将输入流和输出流设置为这个新的连接

    this.OOS=new ObjectOutputStream(server.getOutputStream());
    this.OIS=new ObjectInputStream(server.getInputStream());

然后我将到达的连接(让我们称之为新客户端)存储在客户列表中:

  if(isLogged){ // if success login!
      thsisUser= new Clientuser(server,OOS,OIS,Omsg.my_gender,Omsg.userID);
        boolean IsAdded= EIQserver.OnlineusersList.add(this.thsisUser);

一切正常,客户可以发送消息并与其他客户聊天......

问题是当客户离开时,我得到了这个例外:

SEVERE: null
java.io.EOFException
at    
java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2571)

这是我的离开功能:

 Iterator<Clientuser> iterator = EIQserver.OnlineusersList.iterator();
   if(EIQserver.OnlineusersList.size()>=1)
 Omsg.type= MessageType.Leave;


   sendMessage(OLeavemsg); // tell the partner that I am leaving...

       while (iterator.hasNext()) {
         Clientuser next = iterator.next();
         if (next.ID.equals(OLeavemsg.userID)) 
         {
            next.ClientPort.shutdownInput(); // ClientPort is a socket of this Client
            next.ClientPort.shutdownOutput();
           iterator.remove();// remove the partner
         }
         break;
     }     
       // end leave////////////////////////////////////////////////

连接已从列表中删除,但上述异常会停止服务器...

帮助我摆脱这个复杂的问题

3 个答案:

答案 0 :(得分:0)

你应该关闭这个.OOS和this.OIS。它们将以递归方式关闭内部流。在你当前的情况下外部流失败,因为客户端首先关闭。您可以检查Object * Stream,它们的close方法也关闭内部流。

答案 1 :(得分:0)

谢谢Mikhail,你的回答是解决方案的关键。 对于其他读者,我将描述我是如何解决这个问题的:

  • 首先我关闭了OOS,OIS ......正如你的建议......
  • 其次我停止了线程.. 如何停止线程? :
    • 我声明了名为“Running”的新布尔变量,并将线程主循环的条件设置为while(running) 当我想停止线程的主循环时,我设置running = false 这停止了​​封闭溪流的使用!!

答案 2 :(得分:0)

关闭输入,读取输入时出现EOFException。这正是应该发生的事情。在读取ObjectInputStream时,无论如何都必须捕获EOFException。这里根本没有“复杂问题”。只是糟糕的异常处理。