Chinaunix首页 | 论坛 | 博客
  • 博客访问: 357387
  • 博文数量: 102
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 1116
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-29 16:21
文章分类

全部博文(102)

文章存档

2014年(10)

2011年(1)

2008年(2)

2007年(89)

我的朋友

分类:

2007-04-05 21:53:27

使用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之前的主机和端口时就没有支持缺省主机的情况,还真他妈的变态啊...
阅读(9883) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~