TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
编程中java应用常需要访问Tomcat,Weblogic等中间件,如果因为远程机器没有开机或是中间件服务未启动而导致服务不可用,则程序会抛出异常。如果事先对这些端口进行检测会更有利与我们诊断错误,下面就是一个诊断远程端口的类:
import
java.io.FileInputStream;
import
java.io.FileNotFoundException;
import
java.io.IOException;
import
java.net.Socket;
import
java.util.ArrayList;
import
java.util.List;
import
java.util.Properties;
import
java.util.regex.Matcher;
import
java.util.regex.Pattern;
import
org.apache.log4j.Logger;
import
com.alpha.model.TPClientModel;
import
com.alpha.util.DlgUtil;
/**
* 这个类仅本类使用
*
@author
何杨
* @date 2009-11-5
* @time 下午03:15:20
*/
class
IpPort{
String ip;
int
port;
}
/**
* 远程端口探测器,判断远程端口是否打开
*
*
@author
何杨
* @date 2009-11-5
* @time 下午02:48:56
*/
public
class
RemotePortTestor{
public
static
Logger logger
=
Logger.getLogger(TPClientModel.
class
);
//
测试项目集合
private
List
<
IpPort
>
testItems;
/**
* 构造函数
*
*
@param
fileName
*
@param
keys
*/
public
RemotePortTestor(String fileName,List
<
String
>
keys){
Properties prop
=
new
Properties();
try
{
prop.load(
new
FileInputStream(fileName));
testItems
=
new
ArrayList
<
IpPort
>
();
for
(String key:keys){
String value
=
prop.getProperty(key);
testItems.add(getIpPortAddr(value));
}
}
catch
(FileNotFoundException e) {
logger.error(e);
e.printStackTrace();
}
catch
(IOException e) {
logger.error(e);
e.printStackTrace();
}
}
/**
* 检测远端端口,全部通过返回真
*
*
@return
* 创建人:何杨
* 创建日期:2009-11-5
* 创建时间:下午03:32:34
*/
public
boolean
testRemotePorts(){
for
(IpPort ipPort:testItems){
if
(testRemotePort(ipPort.ip,ipPort.port)
==
false
){
return
false
;
}
}
return
true
;
}
/**
* 从URL中得到IP地址和端口
*
*
@param
url
*
@return
* 创建人:何杨
* 创建日期:2009-11-5
* 创建时间:下午03:32:55
*/
private
IpPort getIpPortAddr(String url){
IpPort ipPort
=
new
IpPort();
String ip
=
getMatchedString(
"
(//)(.*)(:)
"
,url);
ipPort.ip
=
ip;
String port
=
getMatchedString(
"
(:)(\d+)
"
,url);
ipPort.port
=
Integer.parseInt(port);
return
ipPort;
}
/**
* 检测端口是否能连接上
*
*
@param
ip
*
@param
port
*
@return
* 创建人:何杨
* 创建日期:2009-11-5
* 创建时间:下午03:33:20
*/
public
static
boolean
testRemotePort(String ip,
int
port){
try
{
Socket s
=
new
Socket(ip,port);
System.out.println(s.getLocalAddress()
+
"
可以访问
"
+
ip
+
"
上的端口
"
+
port
+
"
的服务.
"
);
s
=
null
;
return
true
;
}
catch
(Exception e) {
System.out.println(
"
无法取得
"
+
ip
+
"
上的端口
"
+
port
+
"
的服务.
"
);
DlgUtil.popupErrorDialog(
"
无法取得
"
+
ip
+
"
上的端口
"
+
port
+
"
的服务!
,请确认服务可用后再执行本程序!
"
);
e.printStackTrace();
logger.error(e);
return
false
;
}
}
/**
* 从target找到regex能代表的文字
*
*
@param
regex
*
@param
target
*
@return
* 创建人:何杨
* 创建日期:2009-11-5
* 创建时间:下午03:33:41
*/
public
static
String getMatchedString(String regex,String target){
Pattern pattern
=
Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Matcher matcher
=
pattern.matcher(target);
while
(matcher.find()){
return
matcher.group(
2
);
}
return
null
;
}
/**
* 测试入口
*
*
@param
args
* 创建人:何杨
* 创建日期:2009-11-5
* 创建时间:下午03:34:06
*/
public
static
void
main(String[] args){
List
<
String
>
ls
=
new
ArrayList
<
String
>
();
ls.add(
"
webservice.url
"
);
ls.add(
"
jmsbroker.url
"
);
String properitesFile
=
TPClientModel.
class
.getResource(
"
/remoteservice.properites
"
).getFile().toString();
RemotePortTestor rt
=
new
RemotePortTestor(properitesFile,ls);
System.out.println(rt.testRemotePorts());
}
}
remoteservice.properites的内容如下:
webservice.url
=
http:
//
localhost:8080/SampleWebService/services/service
jmsbroker.url
=
tcp:
//
192.168.0.110:61616
以上程序会自动从上述URL中找出IP地址和端口,然后用Socket连接过去看是否能联通,主要使用了正则表达式和Socket,比较简单,大家可自行阅读理解。
|
|