从ClientHandler中删除用户时出错

时间:2016-04-18 18:35:31

标签: java sockets

当客户端从套接字关闭连接时出错。应该发生的是用户关闭他们的客户端,然后服务器接收它并且应该递减连接的用户,这些用户存储在相对整数值中。但是,我在删除用户函数时收到与for循环相关的错误。

[WebMethod]
public static string getComplainstatus()
{            
    JavaScriptSerializer TheSerializer = new JavaScriptSerializer();
    string TheJson = TheSerializer.Serialize(ComplainStatus);
    return TheJson;
}

客户端处理程序运行:

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);
        }

1 个答案:

答案 0 :(得分:0)

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

试试这个。

改为使用队列。

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());
}