UDP ArrayList <对象>检查IfClientExists - java

我已经制作了一个简单的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());

似乎不能防止重复,这表明哈希/等值是错误的。这是由eclipse生成的,这是我能做的最好的事情。

参考方案

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

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

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.
}

由于您的类是简单的结构持有人,因此您只能创建一个对象来检查是否已创建该元素。但是请注意,您应该尝试尽快将所有这些(ip,端口,名称)包装在结构中,并在应用程序中使用它们。

ArrayList <Track>的排序 - java

我想根据艺术家的名字对ArrayList进行排序,我已经使用了比较器接口,但是无法对列表进行排序。因此,请帮助我解决问题。曲目数据将从文件Trackdump中读取。该文件每行包含一个曲目数据,格式为TITLE / ARTIST / RATING / BPM这是代码:import java.io.*; import java.util.*; public cl…

无法从ArrayList <String>转换为List <Comparable> - java

当我写下面的代码时,编译器说 无法从ArrayList<String>转换为List<Comparable>private List<Comparable> get(){ return new ArrayList<String>(); } 但是当我用通配符编写返回类型时,代码会编译。private List&l…

合并List <T>和List <Optional <T >> - java

鉴于: List<Integer> integers = new ArrayList<>(Arrays.asList( 10, 12 )); List<Optional<Integer>> optionalIntegers = Arrays.asList( Optional.of(5), Optional.em…

实例化类型<?>的泛型类 - java

我正在为SCJP / OCPJP学习,并且遇到了一个对我来说很奇怪的示例问题。该示例代码实例化了两个通用集合:List<?> list = new ArrayList<?>(); List<? extends Object> list2 = new ArrayList<? extends Object>(); …

List <Dog>是List <Animal>的子类吗?为什么Java泛型不是隐式多态的? - java

我对Java泛型如何处理继承/多态感到困惑。假设以下层次结构-动物(父母)狗-猫(儿童)因此,假设我有一个方法doSomething(List<Animal> animals)。根据继承和多态性的所有规则,我假设List<Dog>是List<Animal>,而List<Cat>是List<Animal&g…