gpt4 book ai didi

java - UDP ArrayList <对象> 检查 IfClientExists

转载 作者:行者123 更新时间:2023-12-02 08:04:49 27 4
gpt4 key购买 nike

我制作了一个简单的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 来保存 Activity 客户端的详细信息。

我构造了一些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 和端口。如果它们存在,客户端将继续,如果不存在,则会添加它们,其中将检查输入的名称。

编辑:

使用以下内容更新了客户详细信息

@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、端口、名称)包装在一个结构中,并在您的应用程序中使用它们。

关于java - UDP ArrayList <对象> 检查 IfClientExists,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15809024/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com