Java UDP阵列列表<;对象>;检查客户是否存在

Java UDP阵列列表<;对象>;检查客户是否存在,java,Java,我制作了一个简单的UDP聊天服务器和客户端 客户端发送包含字符串的数据包,服务器接收该数据包 收到后,服务器应该能够判断IP和端口号是否在客户端列表中 我创建了一个名为ClientDetails的对象类 class ClientDetails { int port; String name; InetAddress address; ClientDetails(InetAddress address, int port, String name) {

我制作了一个简单的UDP聊天服务器和客户端

客户端发送包含字符串的数据包,服务器接收该数据包

收到后,服务器应该能够判断IP和端口号是否在客户端列表中

我创建了一个名为ClientDetails的对象类

class ClientDetails {
   int port; 
   String name;
   InetAddress address;

    ClientDetails(InetAddress address, int port, String name) {
        this.address = address;
        this.port = port;
        this.name = name;
    }
在服务器中,我创建了该对象的ArrayList来保存活动客户端的详细信息

我已经构造了一些If语句和相应的方法来执行大多数操作,但关键是要确定用户是否在接收到的每个数据包的列表中

我想用像这样的东西

if (!IsCurrentlyAUser){
then addNewUserToList();
else checkUserNameValid//ensures the String sent is not one of the keywords(who, whoami, etc)
 addNewUser();}
其思想是IsCurrentlyAUser检查CheckClientExists方法

private boolean checkClientExists(InetAddress ip, int port, String name){


    if (!clientList.contains(ip) && !clientList.contains(port)){
    return false;
}
     return true;

    }
很明显,这是行不通的,但我不知道如何做到这一点或想出更可行的办法

编辑:为了澄清问题并可能使事情复杂化:

检查基于客户端IP和端口。在这种情况下,在记录中只检查ip和端口。如果它们存在,客户端将继续,如果不存在,则添加它们,并检查输入的名称

编辑:

使用以下内容更新了ClientDetails

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((address == null) ? 0 : address.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + port;
return result;
}





@Override
public boolean equals(Object obj) {
if (this == obj)
    return true;
if (obj == null)
    return false;
if (getClass() != obj.getClass())
    return false;
ClientDetails other = (ClientDetails) obj;
if (address == null) {
    if (other.address != null)
        return false;
} else if (!address.equals(other.address))
    return false;
if (name == null) {
    if (other.name != null)
        return false;
} else if (!name.equals(other.name))
    return false;
if (port != other.port)
    return false;
return true;

}
在主服务器中运行以下命令

    if(request.equals("who") ||request.equals("whoami")||
        request.equals("all")||request.equals("bye")){
         //do something 
          System.out.println("User Entered Invalid Name ");
         }else{
              System.out.println("User Entered a Valid Name ");
               clientName =request;
              clients.add(new ClientDetails(clientIP,clientPort,clientName));
                    }
             System.out.println("set contains " +clients.toString());

似乎无法防止重复,这表明hash/equals是错误的。这是由eclipse生成的,这是我所能做的最好的

您可以通过实现方法来改进类
ClientDetails

然后,您将能够将这些数据存储在单个数据库中

类客户端{
私有最终集客户端=新HashSet();
公共布尔checkClientExists(InetAddress ip、int端口、字符串名称){
返回clients.contains(新的ClientDetails(ip、端口、名称));
}
//更多的客户端管理代码。
}

由于您的类是简单的结构持有者,您可以创建它的对象,只需检查是否已经创建了这样的元素。但请注意,您应该尝试尽快将所有这些(ip、端口、名称)封装在一个结构中,并在应用程序中使用它们

打字错误;-)。谢谢你的通知。我不得不暂时停止这方面的工作。现在,我又回到了它,我被困在同一个部分。添加到集合需要在客户端中使用Add方法,我不知道如何做到这一点。你能帮我吗?
class Clients {

 private final Set<ClientDetails> clients = new HashSet<>();

 public boolean checkClientExists(InetAddress ip, int port, String name){

   return  clients.contains(new ClientDetails(ip,port,name));   

 }

//More code for client management.
}