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