使用JMXServiceURL连接服务器的时候,IPv4地址形式的字符串可以接受,IPv6的就不行了。经过千辛万苦,从网上Down了DJ Java Decompiler反编译工具对javax.management.remote.JMXServiceURL类进行反编译,发现网上目前流行的3.9.9.91版本的反编译器虽然有了破解补丁 ,但是还是无法使用,郁闷,下载了一个低版本的,终于可以不用破解直接使用了。
经过反编译,发现JMXServiceURL没有提供对IPv6地址的处理,所以一使用IPv6的地址就会报错。
JMXServiceURL url=new JMXServiceURL("service:jmx:rmi://192.168.0.1/jndi/rmi://192.168.0.1:9999/dlogin");
该类共有Host、Port、Proto、UrlPath等属性,对构造函数传入的字符串解析得来。
在解析的时候将service:jmx作为标志头解析;rmi做为远程协议;/jndi之前的地址段作为主机地址和端口部分被解析,之后得就是UrlPath属性得值啦;在这部分解析的时候,该类使用冒号作为地址和端口的分隔符,众所周知,IPv6地址最不缺的就是冒号,如
JMXServiceURL url=new JMXServiceURL("service:jmx:rmi://[2005:21:847:45::99]/jndi/rmi://[2005:21:847:45::99]:8000/dlogin");
因此一个完整的Ipv6地址被腰斩,然后后面的东东该类怎么看也不像是一个端口地址,因此就报错啦。
分析到这里,将JMXServiceURL类反编译,添加对IPv6地址的解析代码,重新打包,仍然不通,感觉该包内还有其他地方用到这个URL地址对象,全部反编译也没有找到,郁闷中想到的解决办法就是找其他版本的包含JMXServiceURL类的包,看能不能支持IPv6.好像JBoss的就支持。
网上搜得一个Jboss的代码页面,但是下载不了,而且还不知道确切版本,不过是支持Ipv6地址解析的。经过一番搜索,还是无法觅得该段代码的包。无奈之际,想起了使用JMXServiceURL的另一个构造方法,直接传Host、Port、Proto和UrlPath进去。
JMXServiceURL url=new JMXServiceURL("rmi","2005:21:847:45::99",8000,"/jndi/rmi://[2005:21:847:45::99]:8000/dlogin");
结果仍然报错“21:847:45::99]:8000”端口错误,不过这次的错误容易看出来是UrlPath解析出的错,因为只有这部分才会解析地址和端口,于是就在这段字符串上打主意,
修改上句为
JMXServiceURL url=new JMXServiceURL("rmi","2005:21:847:45::99",8000,"/jndi/rmi://:8000/dlogin");
居然成功了,看来JMX还是会解析缺省主机的地址格式的UrlPath,
但是在解析
JMXServiceURL url=new JMXServiceURL("service:jmx:rmi://[2005:21:847:45::99]/jndi/rmi://[2005:21:847:45::99]:8000/dlogin");中的]/jndi/rmi之前的主机和端口时就没有支持缺省主机的情况,还真他妈的变态啊...
阅读(9942) | 评论(0) | 转发(1) |