第一次發文章,原因就是項目想實現一個關於數據庫能否連接需要進行提前判斷,結果網上找了很多辦法基本都是用的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;
}