首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java | Sigar:获取网络流量

Java | Sigar:获取网络流量
EN

Stack Overflow用户
提问于 2017-12-08 21:10:09
回答 1查看 827关注 0票数 0

在Sigar库的帮助下,我尝试使用Java中的以下代码来获取网络流量

代码语言:javascript
复制
import java.util.*;
import java.util.Map.Entry;

import org.hyperic.sigar.NetFlags;
import org.hyperic.sigar.NetInterfaceConfig;
import org.hyperic.sigar.NetInterfaceStat;
import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException;

public class NetworkBandwidth {

    private Map<String, Long> rxCurrentMap = new HashMap<String, Long>();
    private Map<String, List<Long>> rxChangeMap = new HashMap<String, List<Long>>();
    private Map<String, Long> txCurrentMap = new HashMap<String, Long>();
    private Map<String, List<Long>> txChangeMap = new HashMap<String, List<Long>>();
    private List<String> msg;
    private Sigar sigar;
    private String TAG = "LOG: ", serverCode;
    private volatile boolean stopGettingNetworkBandwidth = false;
    private ChannelHandlerContext ctx;

    public NetworkBandwidth(String serverCode, ChannelHandlerContext ctx){
        this.sigar = new Sigar();
        this.serverCode = serverCode;
        this.ctx = ctx;
        this.msg = new ArrayList<>();
        try {
            getMetric();
            System.out.println(TAG + "NETWORK INFO: " + networkInfo());
        } catch (SigarException e) {
            System.out.println(e.toString());
        } 

    private Long[] getMetric() throws SigarException {
        for (String ni : sigar.getNetInterfaceList()) {
            // System.out.println(ni);
            NetInterfaceStat netStat = sigar.getNetInterfaceStat(ni);
            NetInterfaceConfig ifConfig = sigar.getNetInterfaceConfig(ni);
            String hwaddr = null;
            if (!NetFlags.NULL_HWADDR.equals(ifConfig.getHwaddr())) {
                hwaddr = ifConfig.getHwaddr();
            }
            if (hwaddr != null) {
                long rxCurrenttmp = netStat.getRxBytes();
                saveChange(rxCurrentMap, rxChangeMap, hwaddr, rxCurrenttmp, ni);
                long txCurrenttmp = netStat.getTxBytes();
                saveChange(txCurrentMap, txChangeMap, hwaddr, txCurrenttmp, ni);
            }
        }
        long totalrx = getMetricData(rxChangeMap);
        long totaltx = getMetricData(txChangeMap);
        for (List<Long> l : rxChangeMap.values())
            l.clear();
        for (List<Long> l : txChangeMap.values())
            l.clear();
        return new Long[] { totalrx, totaltx };
    }

    private static long getMetricData(Map<String, List<Long>> rxChangeMap) {
        long total = 0;
        for (Entry<String, List<Long>> entry : rxChangeMap.entrySet()) {
            int average = 0;
            for (Long l : entry.getValue()) {
                average += l;
            }
            total += average / entry.getValue().size();
        }
        return total;
    }

    private static void saveChange(Map<String, Long> currentMap,
                                   Map<String, List<Long>> changeMap, String hwaddr, long current,
                                   String ni) {
        Long oldCurrent = currentMap.get(ni);
        if (oldCurrent != null) {
            List<Long> list = changeMap.get(hwaddr);
            if (list == null) {
                list = new LinkedList<Long>();
                changeMap.put(hwaddr, list);
            }
            list.add((current - oldCurrent));
        }
        currentMap.put(ni, current);
    }

    private String networkInfo() throws SigarException {
        String info = sigar.getNetInfo().toString();
        info += "\n"+ sigar.getNetInterfaceConfig().toString();
        return info;
    }

    public void stopGettingNetworkBandwidth(boolean stop){
        stopGettingNetworkBandwidth = stop;
    }

    public void getBandwidth() throws SigarException, InterruptedException {
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true){
                    try{
                        Long[] m = getMetric();
                        long totalrx = m[0];
                        long totaltx = m[1];
                        System.out.print("totalrx(download): ");
                        System.out.println("\t" + Sigar.formatSize(totalrx));
                        System.out.print("totaltx(upload): ");
                        System.out.println("\t" + Sigar.formatSize(totaltx));
                        System.out.println("-----------------------------------");
                        Thread.sleep(1000);
                    }catch (SigarException e){
                        System.out.println(TAG + "Failed to get Network Bandwidth, SigarException >> " + e.toString());
                    }catch (InterruptedException e){
                        System.out.println(TAG + "Failed to get Network Bandwidth, InterruptedException >> " + e.toString());
                    }
                    if (stopGettingNetworkBandwidth)break;if (stopGettingNetworkBandwidth)break;
                }
            }
        }).start();
    }

}

当我浏览互联网时,我以为我得到了网络流量,直到我意识到我得到了意想不到的结果。

我正在开发在局域网内通信的服务器和客户端应用程序,当我没有使用或浏览到互联网时,我预计上面代码的结果是0,但由于应用程序是在局域网内通信,所以我总是得到一个结果。

你知道如何获取互联网使用except when the Server and Client is sending or receiving message inside the LAN吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-10 15:16:20

感谢Ron Maupin提出了有条件的想法。

下面是我解决这个问题的方法

我将方法getBandWidth()更改为getTraffic()

代码语言:javascript
复制
public void getTraffic() throws SigarException, InterruptedException {
        new Thread(new Runnable() {
            @Override
            public void run() {

                long oldReceived = 0, oldSend = 0, newReceived, newSend;

                while (true){
                    try{

                        Long[] m = getMetric();

                        newReceived = m[0];
                        newSend = m[1];

                        if(oldReceived != newReceived || oldSend != newSend){ //if the result is different from the previous

                            oldReceived = newReceived; //put the new result to old result
                            oldSend = newSend; //put the new result to old result

                            if(oldReceived > 999 || oldSend > 999 && oldReceived == 0 || oldSend == 0){
                                System.out.print("totalrx(download): ");
                                System.out.println("\t" + Sigar.formatSize(newReceived));
                                System.out.print("totaltx(upload): ");
                                System.out.println("\t" + Sigar.formatSize(newSend));
                                System.out.println("-----------------------------------");
                            }

                        }
                        Thread.sleep(1000);
                    }catch (SigarException e){
                        System.out.println(TAG + "Failed to get Network Traffic, SigarException >> " + e.toString());
                    }catch (InterruptedException e){
                        System.out.println(TAG + "Failed to get Network Traffic, InterruptedException >> " + e.toString());
                    }
                    if (stopGettingNetworkBandwidth)break;if (stopGettingNetworkBandwidth)break;
                }
            }
        }).start();
    }

我意识到我寻找的不是bandWidth而是网络流量,在观察结果后,我发现当我的ServerClient在本地网络内发送和接收数据时,结果不到一千,而当我浏览或下载时,结果等于一千或更高。

我不确定这是否是可靠的解决方案,但在此期间,我将使用这个解决方案,直到我找到第二个选择。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47715082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档