I'm trying to get the network traffic using the below code in Java with the help of Sigar library
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();
}
}
I though I'm getting the network traffic when I browse into internet until I realize I'm getting unexpected result.
I'm developing Server and Client app that communicates inside the LAN, I was expecting 0
as the result of the above code when I didn't use or browse into internet but since the application was communicating inside the LAN, I'm always getting a result.
any idea on how can I get the internet usage except when the Server and Client is sending or receiving message inside the LAN
?
Thanks to Ron Maupin for the idea of having a condition.
Here's how I solved it
I changed the method getBandWidth()
to getTraffic()
,
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();
}
I realized that I wasn't looking for the bandWidth but the network traffic, and after observing the result, I found out that when my Server
and Client
send and received data inside the local network, the result is less than a thousand, and when I'm browsing or downloading the result is equal to a thousand or higher.
I'm not sure if this is reliable solution but for the meantime I'm gonna used this solution until I found a second option.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.