java - outputStream 关​​闭会导致其他 Streams 阻塞吗?

标签 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////////////////////////////////////////////////

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

帮我解决这个复杂的问题

最佳答案

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

关于java - outputStream 关​​闭会导致其他 Streams 阻塞吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19810299/

相关文章:

java - 正则表达式不匹配

java.net.SocketException : Unresolved address

Java ObjectOutputStream 和更新文件

java - 对象输入流仅通过网络获取一个文件?

java - Mockito 模拟 ObjectOutputStream.writeObject 时出现 NullPointerException?

保存 ArrayList 时由泛型引起的 Java 编译器警告

java - ObjectOutputStream 和 Jtable mouseClick 设置

java - Java 中的切换键

java - 继承java中 protected 成员与私有(private)成员

java - 我如何确认 _JAVA_OPTS 正在执行?