问题
服务器因为防火墙的原因,或者为了安全禁止了ping服务,导致无法ping通,会让我们误判断两个服务器之间网络不通,但是服务器却可以远程访问,是正常连通状态,编写程序判断两个服务器之间网络状况。
思路
1、先判断网络是否可以连通;
2、可以连通在程序中使用ping命令获取网络状况和丢包率;
3、无法连通,使用ping命令先获取网络丢包率,再通过对外开放的端口使用TCP三次握手判断是否可连接;
4、UDP无法判断,UDP是无连接状态,发送出去就不会考虑对方是否接收;
解决
准备:确保被检测的服务器是开启状态,并将需要对外开放的端口放开。
实现代码
获取网络状态

 /*** 获取网络状态* @param host* @param timeout* @return*/private static boolean isHostReachable(String host,Integer timeout){try {return InetAddress.getByName(host).isReachable(timeout);} catch (IOException e) {logger.error("判断网络状态异常" + e.getMessage());e.printStackTrace();}return false;}

使用ping的方式获取丢包率,windows和Linux系统ping命令获取的结果不一样,需要分开解析返回的字符串

 /*** 通过ip获取信息,loss:丢包率,delay:延时* @param cmd* @return*/private static Map<String,String> getNetworkStatusByPing(String os,String cmd){Map<String,String> networkMap = new HashMap<>(3);//获取当前进程运行对象Runtime runtime = Runtime.getRuntime();Process process = null;String line = null;InputStream inputStream = null;InputStreamReader isReader = null;BufferedReader reader = null;String loss = "";//丢包率String delay = "";//延时try {process = runtime.exec(cmd);inputStream = process.getInputStream();//实例化输入流isReader = new InputStreamReader(inputStream,"GB2312");reader = new BufferedReader(isReader);StringBuffer buffer = new StringBuffer();if (os.contains("win") || os.contains("Win")|| os.contains("WIN")){//Windows系统执行结果解析while ((line = reader.readLine()) != null){//丢包率if (line.contains("%")){loss = line.substring(line.lastIndexOf("=") + 1 ,line.indexOf("%") + 1);if (loss.contains("(")){loss = loss.substring(loss.indexOf("(") + 1).trim();}System.out.println(loss);}//网络延时if ((line.contains(",") || line.contains(",")) && line.contains("=") && line.contains("ms")){delay = line.substring(line.lastIndexOf("=") + 1 ,line.lastIndexOf("ms") + 2).trim();System.out.println(delay);}buffer.append(line + "\n");}}else{//Linux系统执行结果解析while ((line = reader.readLine()) != null){//丢包率if (line.contains("%")){String[] msg = null;if (line.contains(",")){msg = line.split(",");}else if (line.contains(",")){msg = line.split(",");}if (msg.length > 0) {loss = msg[2].substring(0, msg[2].indexOf("%") + 1).trim();System.out.println(loss);}}//网络延时if (line.contains("/")){String[] msg = line.split("=");String[] names = msg[0].split("/");String[] values = msg[1].split("/");for (int i = 0;i < names.length;i++){String str = names[i];if ("avg".equalsIgnoreCase(str)){delay = values[i];break;}}System.out.println(delay);}buffer.append(line + "\n");}}if (StringUtils.isNotEmpty(loss)){networkMap.put("loss",loss);}else {networkMap.put("loss","0%");}if (StringUtils.isNotEmpty(delay)){networkMap.put("delay",delay);}else {networkMap.put("delay","99999ms");networkMap.put("status","-1");//无法ping通}System.out.println(buffer.toString());inputStream.close();isReader.close();reader.close();
//            runtime.exit(1);} catch (IOException e) {logger.error("通过ping方式获取网络信息异常:" + e.getMessage());e.printStackTrace();
//            runtime.exit(1);}return networkMap;}

判断开发端口网络状况

 /*** 判断指定端口网络状态* @param localAddress  源地址* @param remoteAddress 目标地址* @param port          端口* @param timeout       超时时间* @return*/private static boolean isRealchable(InetAddress localAddress,InetAddress remoteAddress,int port,int timeout){boolean realchable = false;Socket socket = null;try {socket = new Socket();//端口为0标识在本地挑选一个可用端口进行连接SocketAddress socketAddress = new InetSocketAddress(localAddress,0);socket.bind(socketAddress);InetSocketAddress endpointSocketAddress = new InetSocketAddress(remoteAddress,port);socket.connect(endpointSocketAddress,timeout);System.out.println("Socket连接建立成功");realchable = true;} catch (IOException e) {logger.info("Socket连接失败,localAddress:" + localAddress+ ",remoteAddress:" + remoteAddress + ",port:" + port) ;System.out.println("Socket连接失败,localAddress:" + localAddress+ ",remoteAddress:" + remoteAddress + ",port:" + port );}finally {if (socket != null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}}return realchable;}/*** 判断指定端口网络状况* @param remoteAddress 目标地址* @param port          端口*/public static boolean getNetworkByPort(InetAddress remoteAddress,int port){boolean netStatus = false;Enumeration<NetworkInterface> netInterfaces;try {netInterfaces = NetworkInterface.getNetworkInterfaces();while (netInterfaces.hasMoreElements()){NetworkInterface ni = netInterfaces.nextElement();Enumeration<InetAddress> localAddress = ni.getInetAddresses();while (localAddress.hasMoreElements()){InetAddress local = localAddress.nextElement();if (isRealchable(local,remoteAddress,port,3000)){netStatus = true;break;}}}} catch (SocketException e) {logger.error("获取本地ip与目标地址端口通信失败:" + e.getMessage());e.printStackTrace();}System.out.println(netStatus);return netStatus;}

办法很蠢,路过有获取网络丢包率好办法的请告知一下!

java检测服务器之间网络状况及丢包率相关推荐

  1. zabbix使用fping监控任意两个节点之间的网络质量、丢包率和响应时间

    zabbix使用fping监控任意两个节点之间的网络质量.丢包率和响应时间 zabbix使用fping监控任意两个节点之间的网络质量.丢包率和响应时间之前的博文 使用zabbix3.0.4的ICMP ...

  2. 设置好MTU数值与DNS服务器达到低延迟零丢包率

    教你设置好MTU数值与DNS服务器达到低延迟零丢包率 文章很长,希望大家耐心阅读,这能优化你的网络质量. 丢包率.延迟是评价一条宽带网路素质好坏的常用标准,大丢包率或者大延迟必然严重影响上网体验,而大 ...

  3. 网络环境ping丢包率测试

    网络环境ping丢包率测试 NT: @echo off :START date/t >> aa.txt time/t >> aa.txt ping 192.168.174.13 ...

  4. 实时音视频聊天技术分享:面向不可靠网络的抗丢包编解码器

    本文整理自声网Agora.io编解码算法工匠高泽华在RTC2017实时互联网大会和QCon上海2017上的技术分享.本文仅讨论技术,无关商业因素,请从技术角度理解文中的分享内容即可,如给您带来误导,请 ...

  5. 无连接应用程序丢包率测试/UDP丢包率测试【基于数据报套接字的网络程序设计】

    目录 一.无连接应用程序丢包率测试 二.UDP 丢包率测试服务端 三.UDP丢包率测试客户端 四.用户使用说明(输入 / 输出规定) 五.部分运行结果 六.UDP 丢包率的测试结果分析 (1)讨论服务 ...

  6. wifi丢包率高怎么解决_网络Ping延时高怎么办 网络丢包高怎么解决

    电脑打开网页慢怎么办?利用Ping检测网络时延时高怎么解决呢?小编最近在玩LOL时出现Ping延时高的情况,导致游戏界面非常卡,打开网页时也显得很慢,由于使用笔记本电脑无线网卡来连接外网,因此可以通过 ...

  7. android 下测试网络的丢包率和延迟

    昨天做网络延迟和丢包率,以前没弄过,网上寻找也没找到什么有效的,弄了一下午搞定了,代码如下,希望对大家有帮助,写的不好,还请大家批评指正 String lost = new String();Stri ...

  8. android 丢包率测试,android 下测试网络的丢包率和延迟

    昨天做网络延迟和丢包率,以前没弄过,网上寻找也没找到什么有效的,弄了一下午搞定了,代码如下,希望对大家有帮助,写的不好,还请大家批评指正 String lost = new String(); Str ...

  9. 概括一下服务器丢包率是什么以及影响

    今天我来为大家讲解一下什么是服务器丢包率,以及服务器丢包率有哪些影响,好了,现在我们来概括一下丢包率是什么以及影响,服务器正常运行只要机房提供的宽带是稳定的,而还会持续不断的丢包原因只有一个,那就是超 ...

最新文章

  1. StoryBoard学习(5):使用segue页面间传递数据
  2. python如何做散点图-Python-如何为散点图制作动画?
  3. QList模板类常用接口函数
  4. Angular的HttpClient注入
  5. 洛谷-P1903 数颜色 分块 bitset
  6. 关于二手交易用户指南怎么写_让用户拍案叫绝文案怎么写?试试这3个方法
  7. ATL(COM) 开发下 -- VS2010
  8. 开源硬件 专利_标准和开源:为什么专利待遇不同?
  9. 1950 - Computing Machinery and Intelligence(计算机器与智能,又译作:机器能思考么?)
  10. Cisco简单配置(十三)—链路聚合
  11. caxa计算机编程,CAXA软件编程实例1
  12. Vscode——内置浏览器
  13. PDF Expert教程之批注功能详解
  14. 唤醒手腕Python全栈工程师学习笔记(微机实验篇)
  15. 大量冷笑话 (冬天别看哦~)
  16. PHP isset()与empty()的区别
  17. 是不正确的python语句_关于Python的if else语句,调用else不正确的问题
  18. C++的errorC2039和C2679的解决
  19. 广西桂林公安:借力大数据 构建大平安
  20. textView 的设置文本中某一文字的字体颜色以及图文混排

热门文章

  1. 分享一组制作游戏用的人物立绘/角色形象素材图片,共21张图片
  2. 死磕java_死磕Java——集合
  3. 【智能医疗】发挥人类想象力和创造力,如何实现智能医疗?
  4. 区块链技术六大核心算法
  5. 虹科案例 | 监测各种材料液位居然如此轻松?
  6. 2016京东编程题:小东分苹果
  7. 最小生成树的拓展应用
  8. 初次接触python爬虫requests.get涉及的UA(浏览器标识信息)问题
  9. 从锅炉工到AI专家(4)
  10. INI 文件 - 文件格式规范