java - 从 ClientHandler 中删除用户时出错

标签 java sockets

当客户端关闭套接字连接时出现错误。应该发生的情况是用户关闭其客户端,服务器然后接收此消息并应减少以相对整数值存储的已连接用户。但是,我收到与删除用户函数的 for 循环相关的错误。

public synchronized void removeUsers(Socket client,int clientUser)
        {
            int index=0;
            for (ClientHandler newHandler:userList)
            {
                if(newHandler.getUserId() == clientUser)
                {
                    try
                    {
                        client.close();
                        Thread.currentThread().isInterrupted();
                        userList.remove(index);
                    }
                    catch (IOException e)
                    {
                        System.out.println("Unable to disconnect!");
                        System.exit(1);
                    }
                }
                index++;
            }
        }

客户端处理程序运行:

public void run()
        {
            String message;
            message = input.nextLine(); //Note method!
            getMessage(message);
            System.out.println(message.substring(0, count+1)+"-"+message.substring(count+1));
            while (!message.substring(0, count+1).equals("***CLOSE***"))
            {
                if(message.equals(user.getItemName(1)+"$status$")||  //checks for status of Ball
                        message.equals(user.getItemName(2)+"$status$"))
                {
                    if (user.BidItem(user.getItemName(1)))
                    {
                        System.out.println("Top bid for " +             //posts for server
                            message.substring(0, count+1) + " is: "
                            + user.getTopBid(message.substring(0, count+1)));

                        output.println("Top bid for " +         //posts for client
                            message.substring(0, count+1) + " is: "
                            + user.getTopBid(message.substring(0, count+1))
                            + " by User" +
                            user.getTopBidder(message.substring(0, count+1)));
                    }
                    else
                    {
                        System.out.println("-1");
                        output.println("-1");
                    }
                }
                else
                {
                    if(user.BidItem(message.substring(count+2)))  //same but now for Plate
                    {
                        if(user.isGrtrThanTopBid(message.substring(count+2),
                                Double.parseDouble(message.substring(0, count+1))))
                        {
                            user.setTopBid(message.substring(count+2),
                                    Double.parseDouble(message.substring(0, count+1)), clientUser);
                            System.out.println("Bid Accepted for " + message.substring(count+2));
                            output.println("Bid Accepted for " + message.substring(count+2));
                        }
                        else
                        {
                            System.out.println("Low bid for " + message.substring(count+2));
                            output.println("Low bid for " + message.substring(count+2));
                        }
                    }
                    else
                    {
                        System.out.println("Late bid for " + message.substring(count+2));
                        output.println("Late bid for " + message.substring(count+2));
                    }
                }
                message = input.nextLine();
                count = 0;
                getMessage(message);
            }
            output.println(" messages received.");
            System.out.println("\n* Closing connection... *");
            user.removeUsers(client,clientUser);
        }

完整的错误在这里:

Exception in thread "Thread-2" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
    at java.util.ArrayList$Itr.next(Unknown Source)
    at Users.removeUsers(AuctionServer.java:211) //Relates to top of for loop
    at ClientHandler.run(AuctionServer.java:435)

最佳答案

当您迭代列表时,您无法从列表中删除对象。

试试这个。

而是使用队列。

Queue queue = new LinkedList<Client>();
int index=0;
for (ClientHandler newHandler:userList)
{
    if(newHandler.getUserId() == clientUser)
    {
        try
        {
            client.close();
            Thread.currentThread().isInterrupted();
            queue.add(userList.get(index));
        }
        catch (IOException e)
        {
            System.out.println("Unable to disconnect!");
            System.exit(1);
        }
    }
    index++;
}

while(!queue.isEmpty()) {
     userList.remove(queue.remove());
}

关于java - 从 ClientHandler 中删除用户时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36701772/

相关文章:

Java扫描器完全绕过字符串输入

java - SSL + NIO 的线程安全

java - java中如何使用Socket处理多个连接

java - 传递参数使指针来自整数,而不需要从 printf 进行强制转换调用

Python套接字编程: "Address already in use" after exception

c - 在 Ubuntu 上,setsockopt(...) 无法识别 IPPROTO_IP 的 IP_TTL

java - 如何从 TCP 套接字获取数据到 ByteBuffer

java - 对于 Glassfish 3,为什么 DirectConnectionFactory 在部署我的应用程序时突然给我一个 NullPointerException?

java - 如何转义 Hibernate 的 HQL 中的保留字

java - 将匹配 6 个字符的正则表达式,仅允许数字、前导和尾随空格