在Java中实现新的InetAddress类型

3
今天我们要讨论Java的InetAddress类。它有两个默认实现(实际上是三个,如果考虑InetAddressImpl):Inet4Address用于表示IPv4地址,Inet6Address用于表示IPv6地址。
现在有几种隧道协议。因为我希望软件具有类型安全性,所以考虑将它们实现为InetAddress的子类(例如InetTeredoAddress或Inet6to4Address)。最好的解决方案是继承Inet6Address,但由于它是final,因此该选项被舍弃了。下一个想法是创建InetAddress的子类,并将每个方法委托给其对应的Inet6Address方法:
class InetTeredoAddress
    extends InetAddress {

    protected Inet6Address address;

    @Override
    public boolean isMulticastAddress() {
        return address.isMulticastAddress();
    }

    @Override
    public boolean isAnyLocalAddress() {
        return address.isAnyLocalAddress();
    }

    ...
}

这次,再次失败的原因是它的构造函数只在java.net.*中可见。 只是为了好玩,我尝试创建一个名为java.net的包,并将所有类放在其中。 这样我能够编译,但是当启动程序时(惊讶吧),发生了以下错误

org.testng.TestNGException: java.lang.SecurityException: Prohibited package name: java.net

什么是最好的实现协议的方法?或者Helper类是唯一的解决方案吗?
谢谢提前。
Zota

“隧道协议”是一种隧道协议,它真的是一种不同类型的互联网地址吗? - Raedwald
一般情况下不行 ^^ 但在某些情况下,您可以从另一个IP获取原始IP。例如6to4:看起来像2002:1010:1010::,其中1010:1010是16.16.16.16的十六进制表示,即IPv4地址。因此,我可以定义“真实”地址,只因为我正在使用隧道协议的某些部分 :) - Zotastas
那是一个 Inet6Address,可以定义一个函数将其映射到 Inet4Address。你不应该创建一个类,而是应该创建一个方法 static Inet4Address getTunnelledAddress(Inet6Address) - Raedwald
1个回答

1
忘记它,着手实现一个URLConnectionHandlers家族。

谢谢,但是因为我只想处理IP地址(我不想连接或发送数据之类的),使用URLConnection会是一个相当庞大的方法 ;) - Zotastas
不用写很多,每个协议只需要写两个类就可以了。我已经做过很多次了。如果不涉及I/O,我不明白你所说的“处理IP”具体是什么意思。 - user207421
我从数据库中获取了几个IP地址,必须检测它是否使用隧道协议,并将其转换为程序的几个部分以其IPv4版本表示(而不丢失原始IP)。这类似于GeoIP请求:您处理IP但不传输任何内容。 - Zotastas
所以你只需要在数据库中标记地址即可。 - user207421
嗯,是的和不是的。这将解决检测问题,但不涉及转换部分。因此,我需要一个辅助类。无论如何,我已经创建了一个包含所有内容的接口。这样,如果需要添加新协议,就更容易了。无论如何,对于这个特定的问题,我们已经找到了解决方案,所以谢谢 =) - Zotastas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接