2

ここに私の方法があります

System.out.println("removeConnectedUser called. size connectedUsers="+connectedUsers.size());
if(connectedUsers.remove(conUser));
{
  System.out.println("Removing user "+conUser.conn.getRemoteSocketAddress().toString()+"..."+connectedUsers.size());
  writeUserAction(conUser.conn.getRemoteSocketAddress().toString(),"999");
  try
  {
    conUser.conn.close();
  }catch(IOException e){
      System.out.println("Exception in removeConnectedUser");
  }
  ServerMainPanel.updateConnectedUsers(connectedUsers.size());
}

問題は、このメソッドが複数回呼び出される可能性があるため、必要以上に実行されることです。悪い通話をフィルタリングするために、if(connectedUsers.remove(conUser)); を追加しました。しかし、これは常に true を返します! コンソール出力です

Error in liveUpdate:java.net.SocketException: Connection reset by peer: socket write error
removeConnectedUser called. size connectedUsers=1
Removing user /10.175.33.179:4085 ...0
Error liveSecUpdate:java.net.SocketException: Socket closed
removeConnectedUser called. size connectedUsers=0
Removing user /10.175.33.179:4085 ...0

したがって、vector のサイズがゼロであっても、vector.remove は常に True を返します。1- size()=0 の場合、要素を削除することは不可能です。2- 接続しているクライアントが 1 つだけであるため、このベクターに同じオブジェクトの 2 つのインスタンスがあることは不可能です。

4

1 に答える 1

6

の最後に誤ったセミコロンがありますif:

if(connectedUsers.remove(conUser));
                                  ^ REMOVE THIS

これにより、if条件に関係なく、後続のコード ブロックが実行されます。

于 2013-11-13T09:26:31.787 に答える