第一次发文章,原因就是项目想实现一个关于数据库能否连接需要进行提前判断,结果网上找了很多办法基本都是用的isReachable()进行的判断,不知道为什么这个方法一直返回False,所以只能自己写一个了。下面直接上代码,首先是关于ping IP和端口号的方法
public boolean isHostConnection(String ip, int port) {
Socket socket = new Socket();
try {
socket.connect(new InetSocketAddress(ip, port),3000);
} catch (SocketTimeoutException s) {
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
} finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return true;
}
//下面是返回连接状态的
public List<HashMap<String,Object>> getConnectionState(){
List<HashMap<String,Object>> listMap = new ArrayList<HashMap<String, Object>>();
try {
List<FactoryDataBaseConfig> fdb = factoryDataBaseConfigService.getFactoryState();
List<String> list = new ArrayList<String>();
HashMap<String,Object> map = new HashMap<String,Object>();
for(int i = 0; i < fdb.size(); i++){
boolean result = false;
result = this.isHostConnection(fdb.get(i).getIpHost(), 1433);
if(result){
if(!fdb.get(i).getState().equals("1")){
int factoryState = factoryDataBaseConfigService.updateStateTrue(fdb.get(i).getOrgfk());
if(factoryState == 1){
map.put("success", true);
}else{
map.put("success", false);
}
}
}else{
list.add(fdb.get(i).getOrgname());
if(!fdb.get(i).getState().equals("0")){
int factoryState = factoryDataBaseConfigService.updateStateFalse(fdb.get(i).getOrgfk());
if(factoryState == 1){
map.put("success", true);
}else{
map.put("success", false);
}
}
}
}
map.put("list", list);
listMap.add(map);
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
return listMap;
}