Java 通过网络进行黑名单验证的简单客户机-服务器应用程序

Java 通过网络进行黑名单验证的简单客户机-服务器应用程序,java,sockets,networking,client-server,Java,Sockets,Networking,Client Server,我正在构建一个简单的客户机-服务器应用程序,我想对其实现某种黑名单验证 目前我有一个IP黑名单验证工作,它从一个文件(Blacklist.txt)中读取一个字符串,并将其与套接字IP地址进行比较。如果相等,则拒绝该客户机 我现在想实现的是某种网络黑名单验证,而不是IP 假设我的“blacklist.txt”上有192.168.1.0/24。我需要阻止192.168.1.1到192.168.1.255之间的任何连接 这是我目前拥有的IP黑名单验证代码: BufferedReader

我正在构建一个简单的客户机-服务器应用程序,我想对其实现某种黑名单验证

目前我有一个IP黑名单验证工作,它从一个文件(Blacklist.txt)中读取一个字符串,并将其与套接字IP地址进行比较。如果相等,则拒绝该客户机

我现在想实现的是某种网络黑名单验证,而不是IP

假设我的“blacklist.txt”上有192.168.1.0/24。我需要阻止192.168.1.1到192.168.1.255之间的任何连接

这是我目前拥有的IP黑名单验证代码:

        BufferedReader reader = new BufferedReader(new FileReader("C:\\Users\\Joao\\git\\ProjectoRedes\\lists\\blacklist.txt"));
        String line = null;
        socket = server.accept();

        // Blacklist verification - Do in single thread
        while ((line = reader.readLine()) != null) {
            if (line.equals(socket.getInetAddress().toString())) {
                System.out.println("IP Blacklisted: " + socket.getInetAddress().toString());
                System.out.println("Closing connection to " + socket.getInetAddress().toString());
                PrintStream checkBlack = new PrintStream(socket.getOutputStream(),true);
                checkBlack.println("***BLACKLISTED***");
                reader.close();

                socket.close();
                break; 
            }
        }
然后将输出发送到客户端,客户端关闭套接字,终止连接

我想知道是否有任何简单的方法来实现我上面所说的


非常感谢您的帮助。

我愿意这样做

int ip = ip2int(socket.getInetAddress().getHostName());

// iterate over black list, split item into subnet and bits
String line = "192.168.1.0/24";
String[] a = line.split("/");
int subnet = ip2int(a[0]);
// make a mask
int bits = a.length == 1 ? 0 : Integer.parseInt(a[1]);
int mask = 0xFFFFFFFF << 32 - bits;
// mask client ip and compare
if ((ip & mask) == subnet) {
// match
}

我相信有更好的方法,但是你可以做一个
String#substring
来只提取IP地址的重要部分并进行比较如果我阅读正确,这只解决了我已经解决的问题,尽管它可能更快。不过,我不是在寻找更快的解决方案。我正在寻找一种方法来读取“网络”(192.168.1.0/24),并从中排除192.168.1.1到192.168.1.255中的所有IP,而无需手动将它们添加到列表中。是的,我认为这样可以做到,尽管我仍在努力理解“制作掩码”部分。另一件事,关于
if((ip&mask)==子网)
什么是
ip
变量?当然,但我的意思是,不能以
InetAddress
的形式进行比较,我应该把它放在哪种形式中?所以基本上它的
if((子网&mask)==子网)
?否。子网是黑名单中的下一个ip地址,我们将其与客户端ip进行比较,但不包含较低的位。这就是为什么我们使用面具
int ip2int(String ip) throws UnknownHostException {
    InetAddress a = InetAddress.getByName(ip);
    return  new BigInteger(a.getAddress()).intValue();
}