2011-09-15 8 views
3

私は、ユーザーのリンク速度をテストするJavaアプレットを作成しました。私はいくつかのシステム情報promユーザのコンピュータを収集します:CPU負荷、SIGAR APIを使ってeth0インターフェイスとNICカードの最大速度でダウンロードされるデータ量。私は、Webサーバー上に展開されますが、私はそれを実行しようとすると、Javaコンソールでのエラー情報以下の取得:これが原因アプレットのセキュリティ制限に、しかしSIGARユーザーからブロックされていない場合Sigar APIを使用してJavaアプレットのシステムパラメータを読み取ると、 "AccessControlException:access denied"がスローされる

java.lang.reflect.InvocationTargetException 
    at java.awt.EventQueue.invokeAndWait(Unknown Source) 
    at speedtester_pkg.AppletMain.init(AppletMain.java:80) 
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: java.lang.ExceptionInInitializerError 
    at speedtester_pkg.Test.<init>(Test.java:54) 
    at speedtester_pkg.AppletMain.createGUI(AppletMain.java:282) 
    at speedtester_pkg.AppletMain$1.run(AppletMain.java:82) 
    at java.awt.event.InvocationEvent.dispatch(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$000(Unknown Source) 
    at java.awt.EventQueue$1.run(Unknown Source) 
    at java.awt.EventQueue$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 
Caused by: java.security.AccessControlException: access denied (java.util.PropertyPermission sigar.nativeLogging read) 
    at java.security.AccessControlContext.checkPermission(Unknown Source) 
    at java.security.AccessController.checkPermission(Unknown Source) 
    at java.lang.SecurityManager.checkPermission(Unknown Source) 
    at java.lang.SecurityManager.checkPropertyAccess(Unknown Source) 
    at java.lang.System.getProperty(Unknown Source) 
    at org.hyperic.sigar.Sigar.<clinit>(Sigar.java:78) 
    ... 17 more 

私はわかりませんフォーラム(http://forums.hyperic.com/jiveforums/forum.jspa?forumID=2)私は印象を持っている、それはWebアプリケーションで使用することが可能です。

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 

package speedtester_pkg; 

import java.io.File; 
import java.io.IOException; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.security.AccessController; 
import java.security.PrivilegedAction; 
import java.util.ArrayList; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import org.hyperic.sigar.CpuPerc; 
import org.hyperic.sigar.NetInterfaceStat; 
import org.hyperic.sigar.Sigar; 
import org.hyperic.sigar.SigarException; 

/** 
* The logic of the speed test. Starts downloading threads and performs measurements. 
* 
* @author Karol Abramczyk 
*/ 
public class Test implements Runnable{ 

    private ArrayList <String> urlsValues; 
    private URL[] urls; 
    private File[] files; 
    private int stabilizationTimeSeconds, threadNo, allThreadsNo; 
    private boolean continueDownload; 
    public AppletMain applet; 
    private Sigar sigar; 
    private NetInterfaceStat nis; 
    private long downloadedDataOld, downloadedDataNew, uploadedDataOld, uploadedDataNew, dataDownloaded, 
      downloadingTime; 
    private long startTime, stopTime; 
    private double speed; 
// private String dir = "D:\\StraTJ_THD\\Abramczyk\\TestySpeedtestera\\"; 


    /** 
    * Creates new instance of the Test object 
    * @param gui the calling AppletGUI object 
    * @param urlsVal the list of urls to files to download 
    * @param time the time of the delay for line stabilization 
    */ 
    public Test(AppletMain applet, ArrayList<String> urlsVal, int time){ 
     try { 
      this.applet = applet; 
      this.urlsValues = urlsVal; 
      stabilizationTimeSeconds = time; 
      allThreadsNo = urlsVal.size(); 
      AccessController.doPrivileged(new PrivilegedAction() 
      { public Object run() 
       { 
       try { 
        sigar = new Sigar(); 
        nis = sigar.getNetInterfaceStat("eth0"); 
       } catch (SigarException ex) { 
        Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex); 
       } 
       return null; 
       } 
      }); 


      urls = new URL[allThreadsNo]; 
      for (int j = 0; j < allThreadsNo; j++) { 
        urls[j] = new URL(urlsValues.get(j)); 
      } 
     } catch (MalformedURLException ex) { 
      Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    /** 
    * returns number of bytes downloaded so far 
    * @return number of bytes downloaded 
    */ 
    private long getDownloadedDataSize() 
    { 
     return nis.getRxBytes()*8; 
    } 

    /** 
    * returns number of bytes uploaded so far 
    * @return number of bytes uploaded 
    */ 
    private long getUploadedDataSize() 
    { 
     return nis.getTxBytes()*8; 
    } 

    /** 
    * saves data on the test start: time, downloaded and uploaded number of bytes 
    */ 
    private void getStartData() 
    { 
     downloadedDataOld = getDownloadedDataSize(); 
     uploadedDataOld = getUploadedDataSize(); 
     startTime = System.currentTimeMillis(); 
     System.out.println(nis.getRxBytes()); 
     System.out.println(downloadedDataOld); 
    } 

    /** 
    * saves dataon the test stop: time, downloaded and uploaded number of bytes 
    */ 
    private void getStopData() 
    { 
     stopTime = System.currentTimeMillis(); 
     downloadedDataNew = getDownloadedDataSize(); 
     uploadedDataNew = getUploadedDataSize(); 
    } 

    /** 
    * starts downloading all the files specified in input file 
    * @throws java.io.IOException 
    * @throws java.lang.InterruptedException 
    */ 
    public void startDownload() throws IOException, InterruptedException{ 
     continueDownload = true; 

     files = new File[allThreadsNo]; 
     for (int g = 0; g < allThreadsNo; g++) { 
      String name = "speedTest" + g + "_"; 
      files[g] = File.createTempFile(name, null); 
     } 

     Thread[] threads = new Thread[allThreadsNo]; 
     for(int i=0; i<allThreadsNo;i++) 
     { 
      threadNo = i; 
      threads[threadNo] = new Thread(new Download(this, threadNo)); 
      threads[threadNo].start(); 
     } 

    } 

    /** 
    * preforms mesurements of speed ralated values as speed, cpu load, nic card speed 
    * @throws org.hyperic.sigar.SigarException 
    * @throws java.lang.InterruptedException 
    */ 
    private void measure() throws SigarException, InterruptedException { 

     measureCPUload(); 

     measureLinkSpeed(); 

     System.out.println(dataDownloaded); 
     System.out.println(downloadingTime); 
     System.out.println(speed); 

     measureNICspeed(); 

    } 

    /** 
    * measures system CPU load and displays it in applet GUI 
    * @throws org.hyperic.sigar.SigarException 
    */ 
    private void measureCPUload() throws SigarException 
    { 
     CpuPerc cpuPerc = sigar.getCpuPerc(); 
     applet.setLabelProcessorLoad(CpuPerc.format(cpuPerc.getCombined())); 
     applet.setCpuLoad(CpuPerc.format(cpuPerc.getCombined())); 
    } 

    /** 
    * measures link speed as: 
    * (number_of_bytes_downloaded_at_the_end - number_of_bytes_downloaded_at_the_beginning)/test_time 
    * @throws org.hyperic.sigar.SigarException 
    */ 
    private void measureLinkSpeed() throws SigarException 
    { 
     nis = sigar.getNetInterfaceStat("eth0"); 
     getStopData(); 
     dataDownloaded = downloadedDataNew-downloadedDataOld; 
     downloadingTime = (stopTime - startTime)/1000; 
     speed = dataDownloaded/downloadingTime; 
     applet.setLabelLinkSpeed(formatSpeed(speed)); 
     applet.setSpeed(formatSpeed(speed)); 
    } 

    /** 
    * measures Network Card Interface speed 
    * @throws org.hyperic.sigar.SigarException 
    */ 
    private void measureNICspeed() throws SigarException 
    { 
     nis = sigar.getNetInterfaceStat("eth0"); 
     long nicSpeed = nis.getSpeed(); 
     applet.setLabelNIC(formatSpeed(nicSpeed)); 
     applet.setNICspeed(formatSpeed(nicSpeed)); 
    } 

    /** 
    * stops file download 
    */ 
    private void stopDownload() 
    { 
     continueDownload = false; 
    } 

    /** 
    * formats link speed to more readable format with units. For example "3.54324E7" 
    * would be formatted to "35.0 Mb/s" 
    * @param speed the link speed 
    * @return the more readable link speed with units 
    */ 
    public String formatSpeed(double speed) 
    { 
     double speedD; 
     int speedI; 

     if(speed>=1000000) 
     { 
      speedI = (int)speed/10000; 
      speedD = speedI/100; 
      return new String(speedD + " Mb/s"); 
     } 
     else if(speed<1000000 && speed>=1000) 
     { 
      speedI = (int)speed/10; 
      speedD = speedI/100; 
      return new String(speedD + " Kb/s"); 
     } 
     else 
     { 
      speedI = (int)speed*100; 
      speedD = speedI/100; 
      return new String(speedD + " b/s"); 
     } 

    } 

    /** 
    * starts the test thread 
    */ 
    public void run() { 
     try { 
      startDownload(); 
      getStartData(); 
      System.out.println("Sleep for " + stabilizationTimeSeconds + " seconds"); 
      Thread.sleep(stabilizationTimeSeconds * 1000); 
      System.out.println("Sleep finished"); 
      measure(); 
      stopDownload(); 
      Thread.sleep(1000 * files.length/2); 
      //   removeDownloadedFiles(); 
     } catch (SigarException ex) { 
      Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (IOException ex) { 
      Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } 

    public URL[] getUrls() { 
     return urls; 
    } 

    public boolean isContinueDownload() { 
     return continueDownload; 
    } 

    public File[] getFiles() { 
     return files; 
    } 

    public int getStabilizationTimeSeconds() { 
     return stabilizationTimeSeconds; 
    } 

} 

これが私の最初のアプレットであり、私は誰も私を助けることができるので、もしWebソリューションに精通していないです、私は感謝:

この

はSigarのAPIを使用して私のクラスです。私は多くの似たような話題を通してサーチャーを持っていますが、解決策は見当たりませんでした。私はAccessCOntroller.do Priviliged()メソッドを使用しようとしましたが、うまくいきませんでした。 jarファイルにアプレットクラスで署名しました。私はこれらのjarライブラリに署名する必要があるかどうかはわかりません。私のhtmlファイルは次の通りです:

<HTML> 
<HEAD> 
    <TITLE>Speed Test</TITLE> 
</HEAD> 
<BODY> 


<P> 
<APPLET 
    code="speedtester_pkg.AppletMain" 
    archive="SpeedTester.jar,activation.jar,mail.jar,mailapi.jar,sigar.jar,smtp.jar" 
    width=440  
    height=600> 
</APPLET> 
</P> 

</BODY> 
</HTML> 

答えて

3

アプレットは特定のことをするために信頼される必要があります。信頼できるようにするには、アプレット(およびその他の依存するJars)は、開発者がデジタル署名(有効なコード署名証明書を使用)する必要があります。

  1. プロンプトが表示されたら、エンドユーザーはOKをクリックします。プロンプトを表向きに投げる前に、ユーザーに必要なもの(「プロンプトが表示されたらOKをクリック」)と理由(「アプレットが機能するように」)を事前に警告するのが一般的です。
+0

@ 1 Java Web Startアプリケーションです。このような問題に対しては、推奨される解決策ですか? Webページにアプレットを配備するソリューションがありますか?それは、依存するjarファイルに署名してサーバーに置くだけで役立つでしょうか? – k4b