程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> 關於J2ME網絡應用程序的性能探討

關於J2ME網絡應用程序的性能探討

編輯:JAVA編程入門知識
  J2ME應用程序已經
  我在應用開發過程中,經常用到J2ME的網絡應用,但限於J2ME無線設備的能力,我們不得不在可用性和性能之間作出選擇,因此,我做了以下的試驗,並由此總結出一點結論,以方便後來者不必再走彎路。
  
  我的應用主要功能是測試J2ME設備的網絡連接性能,因此,其他方面的測試概不涉及。
  
  我們知道,J2ME的通用連接框架為我們提供了http/socket/數據報/本地文件/線外等連接方式,但由於具體設備實現不同而導致程序開發方面的不便。舉例來說,J2ME 的 MIDP 1.0版本中沒有規定socket是必須的,但到了MIDP 2.0 socket才成為必須實現的協議。因此,現階段大多數流行的設備都沒有socket連接,這給我們編程帶來了不利因素。在我們的測試程序中,SOCKET測試采用了StreamConnection類來建立連接,而走的是socket協議。分析一下程序即可知。
  
  本文涉及了多種協議情況下的數據上傳與下載,中文上傳下載處理及網絡傳輸計時、數據加密解密等方面的內容。為了做到通用,我在該程序的實現中沒有用到特定設備的類。
  
  本文給出的測試數據中第一個是建立連接所使用的時間,其余9項是連接建立後的數據傳送時間。最後一項是前面9項數據的平均值。
  
  測試結果數據比較:
  
  機型,所用時間(秒),連接次數
  
  SUN WTK 模擬器
  HTTP  1.391 0.188 0.625 0.141 0.141 0.391 0.313 0.204 0.375 0.484 0.318
  SOCK  0.500 0.531 0.157 0.531 0.360 0.172 0.313 0.641 0.437 0.266 0.378
  
  Nokia6610
  HTTP 4.258 1.682 1.612 1.373 2.681 1.820 1.264 1.512 1.919 1.808 1.741
  SOCK 未通過
  
  Nokia 7650
  HTTP  7.812 2.790 2.641 2.500 2.630 3.922 2.438 2.672 2.219 2.594  2.712
  SOCK  1.719 1.312 1.609 3.359 3.360 1.375 1.781 3.313 1.250 1.329  2.076
  
  Nokia 6600
  HTTP  3.937 1.984 2.172 1.641 1.500 1.531 2.125 1.906 1.843 2.156 1.873
  SOCK  3.188 1.281 1.406 1.266 1.833 1.688 1.719 1.688 1.625 1.703 1.579
  
  索愛P802
  HTTP  7.484 1.484 1.500 1.859 1.485 1.500 1.938 1.781 1.938 1.701 1.687
  SOCK  1.360 1.328 1.281 1.625 1.406 1.592 1.140 1.281 1.312 1.297 1.362
  
  從以上數據分析,我認為:
  1、每一款機器每一種連接方式在同一時刻的網絡連接速度波動都較大,即每一次連接都可能有導致網絡連接滯後的不確定因素;
  2、無論哪一種連接方式,無線設備的網絡連接速度比PC連接要慢;
  3、當前網絡連接的時間超過了游戲者可接受的延遲,不適合做實時或即時性操作;
  4、隨著中國移動EDGE的上線,或者聯通公司的CDMA1X普及,實時性手機應用將會得到發展,但仍需要進一步測試;
  5、在無線應用網絡連接術語中有呼叫建立延遲(Call Setup latency)和通話信號傳輸延遲(Intra-call latency)兩種,從以上數據可以看出,第一種延遲要比後一種延遲要明顯一些,即第一次連接時用戶需要等待更多的時間;
  
  以下是本文的代碼片斷:
  
  public class Game extends MIDlet implements CommandListener {
  private Display display;
  private Form fmHTTP;
  private Form fmHTTP2;
  private Form fmStream;
  private Form fmSocket;
  private Command cmdTest  = new Command("測試", Command.BACK, 0);
  private Command cmdStream = new Command("STREAM", Command.ITEM, 1);
  private Command cmdSocket = new Command("SOCKET", Command.ITEM, 2);
  private Command cmdHTTP  = new Command("HTTP", Command.ITEM, 3);
  private TestThread testThread;
  public Game() {
  display = Display.getDisplay(this);
  
  fmHTTP = new Form("1.HTTP測試");
  fmHTTP.addCommand(cmdStream);
  fmHTTP.addCommand(cmdSocket);
  fmHTTP.addCommand(cmdHTTP2);
  fmHTTP.addCommand(cmdExit);
  fmHTTP.setCommandListener(this);
  fmHTTP.append("HTTP協議網絡測試工具用於檢測手機是否具備HTTP網絡連接能力。第一行數據是由服務器產生的,經過UTF編碼和DES加密傳輸到手機上的。 ");
  
  fmStream = new Form("3.STREAM測試");
  fmStream.addCommand(cmdHTTP);
  fmStream.addCommand(cmdHTTP2);
  fmStream.addCommand(cmdSocket);
  fmStream.setCommandListener(this);
  fmStream.append("STREAM網絡連接是走的socket端口,對應的服務器端口是10000。 ");
  testThread = new TestThread(getAppProperty("Server").toLowerCase().trim());
  }
  
  class TestThread implements Runnable {
  private String server;
  private String message;
  private Form curForm;
  private int responseCode;
  private InputStream is2;
  private HttpConnection conHttp;
  
  
  private String keyOptimize;
  private HttpConnection conOptimize;
  
  public TestThread(String server) {
  this.server = server;
  }
  
  public void start(Form curForm) {
  this.curForm = curForm;
  Thread t = new Thread(this);
  t.start();
  }
  
  public void run() {
  message = "";
  long start,timeused;
  int formid = Integer.parseInt(curForm.getTitle().substring(0,1));
  start = System.currentTimeMillis(); //網絡用時測試起點
  if (formid==1) { //1.HTTP測試
  try {
  String key = genPassWord(); //產生8位的隨機字符串密碼,用於返回給服務器進行DES加密
  conHttp = (HttpConnection) Connector.open("http://" + server + ":8080/ns/hellodes?r=" + key);
  responseCode = conHttp.getResponseCode();
  if (responseCode==HttpConnection.HTTP_OK){
    InputStream is = conHttp.openInputStream();
    int len = (int) conHttp.getLength();
    byte[] bytestr = new byte[len];
    is.read(bytestr); //直接從輸入流中讀取字節,
    cipher = new DesCipher(key.getBytes());
    for (int i = 0; i < bytestr.length / 8; i++) {
    cipher.decrypt(bytestr, i * 8, bytestr, i * 8); //解密;
    }
    message = gbDecode(new String(bytestr)); //解碼
    is.close();
    is = null;
  }else{
    message = "服務器無法連接!" + responseCode;
  }
  } catch (Exception e) {
  message = e.getMessage();
  }
  } else if (formid==3) { //3.STREAM測試
  try {
  conStream = (StreamConnection) Connector.open("socket://"  + server + ":10000", Connector.READ_WRITE);
  InputStream is = conStream.openInputStream();
  byte[] outs = new byte[20];
  int len = 0, ch;
  while ((ch = is.read()) != -1) {
    outs[len] = (byte) ch;
    len++;
  }
  byte[] bytestr = new byte[len];
  System.arraycopy(outs, 0, bytestr, 0, len);
  message = gbDecode(new String(bytestr));
  is.close();
  is = null;
  } catch (Exception e) {
  message = e.getMessage();
  }
  } else if (formid==4) { //SOCKET測試
  /*
  try {
  sck = (SocketConnection)Connector.open("socket://"+server+":10009",Connector.READ_WRITE);
  sck.setSocketOption(SocketConnection.LING
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved