From 6a4a03b329c1c92726bcecc6480d821a2938eb4f Mon Sep 17 00:00:00 2001 From: biezhi Date: Tue, 28 Feb 2017 19:01:43 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=84=20fix=20https://github.com/biezhi/wec?= =?UTF-8?q?hat-robot/issues/27?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../biezhi/wechat/service/WechatService.java | 18 ++-- .../wechat/service/WechatServiceImpl.java | 26 ++++-- .../java/me/biezhi/wechat/util/PingUtil.java | 91 +++++++++++++++++++ 3 files changed, 119 insertions(+), 16 deletions(-) create mode 100644 src/main/java/me/biezhi/wechat/util/PingUtil.java diff --git a/src/main/java/me/biezhi/wechat/service/WechatService.java b/src/main/java/me/biezhi/wechat/service/WechatService.java index 021ca4a..ae1f918 100644 --- a/src/main/java/me/biezhi/wechat/service/WechatService.java +++ b/src/main/java/me/biezhi/wechat/service/WechatService.java @@ -12,27 +12,27 @@ public interface WechatService { * 获取UUID * @return */ - String getUUID() throws WechatException; + String getUUID(); /** * 微信初始化 * @param wechatMeta * @throws WechatException */ - void wxInit(WechatMeta wechatMeta) throws WechatException; + void wxInit(WechatMeta wechatMeta); /** * 开启状态通知 * @return */ - void openStatusNotify(WechatMeta wechatMeta) throws WechatException; + void openStatusNotify(WechatMeta wechatMeta); /** * 获取联系人 * @param wechatMeta * @return */ - WechatContact getContact(WechatMeta wechatMeta) throws WechatException; + WechatContact getContact(WechatMeta wechatMeta); /** * 选择同步线路 @@ -41,26 +41,26 @@ public interface WechatService { * @return * @throws WechatException */ - void choiceSyncLine(WechatMeta wechatMeta) throws WechatException; + void choiceSyncLine(WechatMeta wechatMeta); /** * 消息检查 * @param wechatMeta * @return */ - int[] syncCheck(WechatMeta wechatMeta) throws WechatException; + int[] syncCheck(WechatMeta wechatMeta); /** * 处理聊天信息 - * @param wechatRequest + * @param wechatMeta * @param data */ - void handleMsg(WechatMeta wechatMeta, JSONObject data) throws WechatException; + void handleMsg(WechatMeta wechatMeta, JSONObject data); /** * 获取最新消息 * @param meta * @return */ - JSONObject webwxsync(WechatMeta meta) throws WechatException; + JSONObject webwxsync(WechatMeta meta); } diff --git a/src/main/java/me/biezhi/wechat/service/WechatServiceImpl.java b/src/main/java/me/biezhi/wechat/service/WechatServiceImpl.java index b610b13..c6b6dcb 100644 --- a/src/main/java/me/biezhi/wechat/service/WechatServiceImpl.java +++ b/src/main/java/me/biezhi/wechat/service/WechatServiceImpl.java @@ -1,7 +1,9 @@ package me.biezhi.wechat.service; import java.io.File; +import java.util.concurrent.TimeUnit; +import me.biezhi.wechat.util.PingUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -164,7 +166,7 @@ private void getGroup(WechatMeta wechatMeta, WechatContact wechatContact) { * 获取UUID */ @Override - public String getUUID() throws WechatException { + public String getUUID() { HttpRequest request = HttpRequest.get(Constant.JS_LOGIN_URL, true, "appid", "wx782c26e4c19acffb", "fun", "new", "lang", "zh_CN", "_", DateKit.getCurrentUnixTime()); @@ -190,7 +192,7 @@ public String getUUID() throws WechatException { * 打开状态提醒 */ @Override - public void openStatusNotify(WechatMeta wechatMeta) throws WechatException { + public void openStatusNotify(WechatMeta wechatMeta) { String url = wechatMeta.getBase_uri() + "/webwxstatusnotify?lang=zh_CN&pass_ticket=" + wechatMeta.getPass_ticket(); @@ -230,7 +232,7 @@ public void openStatusNotify(WechatMeta wechatMeta) throws WechatException { * 微信初始化 */ @Override - public void wxInit(WechatMeta wechatMeta) throws WechatException { + public void wxInit(WechatMeta wechatMeta) { String url = wechatMeta.getBase_uri() + "/webwxinit?r=" + DateKit.getCurrentUnixTime() + "&pass_ticket=" + wechatMeta.getPass_ticket() + "&skey=" + wechatMeta.getSkey(); @@ -276,7 +278,7 @@ public void wxInit(WechatMeta wechatMeta) throws WechatException { * 选择同步线路 */ @Override - public void choiceSyncLine(WechatMeta wechatMeta) throws WechatException { + public void choiceSyncLine(WechatMeta wechatMeta) { boolean enabled = false; for(String syncUrl : Constant.SYNC_HOST){ int[] res = this.syncCheck(syncUrl, wechatMeta); @@ -297,14 +299,24 @@ public void choiceSyncLine(WechatMeta wechatMeta) throws WechatException { * 检测心跳 */ @Override - public int[] syncCheck(WechatMeta wechatMeta) throws WechatException{ + public int[] syncCheck(WechatMeta wechatMeta){ return this.syncCheck(null, wechatMeta); } /** * 检测心跳 */ - private int[] syncCheck(String url, WechatMeta meta) throws WechatException{ + private int[] syncCheck(String url, WechatMeta meta){ + + // 如果网络中断,休息10秒 + if(PingUtil.netIsOver()){ + try { + TimeUnit.SECONDS.sleep(10); + } catch (Exception e){ + LOGGER.error("", e); + } + } + if(null == url){ url = meta.getWebpush_url() + "/synccheck"; } else{ @@ -435,7 +447,7 @@ private String getUserRemarkName(String id) { } @Override - public JSONObject webwxsync(WechatMeta meta) throws WechatException{ + public JSONObject webwxsync(WechatMeta meta){ String url = meta.getBase_uri() + "/webwxsync?skey=" + meta.getSkey() + "&sid=" + meta.getWxsid(); diff --git a/src/main/java/me/biezhi/wechat/util/PingUtil.java b/src/main/java/me/biezhi/wechat/util/PingUtil.java new file mode 100644 index 0000000..3b45069 --- /dev/null +++ b/src/main/java/me/biezhi/wechat/util/PingUtil.java @@ -0,0 +1,91 @@ +package me.biezhi.wechat.util; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.InetAddress; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class PingUtil { + + public static boolean ping(String ipAddress) throws Exception { + int timeOut = 3000 ; //超时应该在3钞以上 + boolean status = InetAddress.getByName(ipAddress).isReachable(timeOut); // 当返回值是true时,说明host是可用的,false则不可。 + return status; + } + + /** + * 返回是否能ping通 + * @param ipAddress + * @return + * @throws Exception + */ + public static boolean ping02(String ipAddress) throws Exception { + String line = null; + try { + Process pro = Runtime.getRuntime().exec("ping " + ipAddress); + BufferedReader buf = new BufferedReader(new InputStreamReader(pro.getInputStream())); + while ((line = buf.readLine()) != null){ + if(line.startsWith("PING")){ + continue; + } + if(line.indexOf("timeout") != -1){ + return false; + } + return true; + } + return false; + } catch (Exception ex) { + return false; + } + } + + public static boolean ping(String ipAddress, int pingTimes, int timeOut) { + BufferedReader in = null; + Runtime r = Runtime.getRuntime(); // 将要执行的ping命令,此命令是windows格式的命令 + String pingCommand = "ping " + ipAddress + " -n " + pingTimes + " -w " + timeOut; + try { // 执行命令并获取输出 + System.out.println(pingCommand); + Process p = r.exec(pingCommand); + if (p == null) { + return false; + } + in = new BufferedReader(new InputStreamReader(p.getInputStream())); // 逐行检查输出,计算类似出现=23ms TTL=62字样的次数 + int connectedCount = 0; + String line = null; + while ((line = in.readLine()) != null) { + connectedCount += getCheckResult(line); + } // 如果出现类似=23ms TTL=62这样的字样,出现的次数=测试次数则返回真 + return connectedCount == pingTimes; + } catch (Exception ex) { + ex.printStackTrace(); // 出现异常则返回假 + return false; + } finally { + try { + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + //若line含有=18ms TTL=16字样,说明已经ping通,返回1,否則返回0. + private static int getCheckResult(String line) { // System.out.println("控制台输出的结果为:"+line); + Pattern pattern = Pattern.compile("(\\d+ms)(\\s+)(TTL=\\d+)", Pattern.CASE_INSENSITIVE); + Matcher matcher = pattern.matcher(line); + while (matcher.find()) { + return 1; + } + return 0; + } + + public static boolean netIsOver(){ + try { + return !ping02("114.114.114.114"); + } catch (Exception e){ + return true; + } + } + + +} \ No newline at end of file