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