- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我制作了一个简单的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/
我制作了一个简单的UDP聊天服务器和客户端 客户端发送一个包含字符串的数据包,服务器接收它。 收到后,服务器应该能够判断 IP 和端口号是否在客户端列表中。 我创建了一个名为 ClientDetail
我是一名优秀的程序员,十分优秀!