2013-10-15 19 views
2

这是关于java的InetAddress类。有2个默认实现(如果您计数为InetAddressImpl,则实际为3):代表IPv4地址的Inet4Address和代表IPv6地址的Inet6Address今天在Java中实现新的InetAddress类型

现在有几个隧道协议。因为我希望软件是类型安全的,所以我考虑将它们实现为InetAddress(例如,InetTeredoAddressInet6to4Address)的子类。最好的解决方案是从Inet6Address继承,但因为它是最终的,所以这个选项被删除。接下来的想法是创建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 

什么是执行协议的最好方法?或者是助手类唯一的解决方案?

在此先感谢

Zota

+0

“隧道协议”是一种隧道协议,真的是一种不同类型的Internet地址? – Raedwald

+0

那么一般不会有^^,但在某些情况下,您可以将原始IP从另一个中取出。例如6to4:类似于'2002:1010:1010 ::',其中1010:1010是16.16.16.16的十六进制表示,即IPv4地址。所以我可以定义“真实”地址,只是因为我使用了隧道协议的某些部分:) – Zotastas

+0

这是一个'Inet6Address',为此可以定义一个映射到'Inet4Address'的函数。而不是创建一个类,你应该创建一个方法'静态Inet4Address getTunnelledAddress(Inet6Address)'。 – Raedwald

回答

0

算了,并着手实施家庭URLConnectionHandlers代替。

+0

谢谢,但是因为我只是想处理IP(我不想连接或发送数据或什么)URLConnection将是一个相当大的方法;) – Zotastas

+0

不是真的,你只需要为每个协议编写两个类。我做了很多次。如果不涉及I/O,我不明白'处理IP'究竟意味着什么。 – EJP

+0

我从数据库中获得了几个IP,并且必须检测它是否使用了隧道协议,并将其在程序的多个部分中转换为其IPv4版本(不丢失原始IP)。这与GeoIP请求类似:您处理IP但不转移某些内容。 – Zotastas