J2ME網路編程以及網路遊戲的實現

來源:互聯網
上載者:User
編程|網路

  引言

  J2ME(Java 2 Micro Edition)是Java 2的一個組成部分,是一種高度最佳化的Java運行環境,主要針對消費類電子裝置的,例如蜂窩電話、可視電話、數字機頂盒和汽車導航系統等等。即J2ME是為消費電子產品和手持功能量身定製的Java專用版本。

  J2ME的出現使開發跨平台的消費類電子產品的應用軟體成為可能。Java語言的與平台無關的特性移植到小型電子裝置上,允許移動無線裝置之間共用應用程式。它提供了基於HTTP的進階Internet協議,使行動電話能以Client/Server方式直接存取Internet的全部資訊,從而使得不同的Client訪問不同的資源。

  隨著網路技術的發展,在將來的無線通訊時代中,大量的網路應用程式將被開發出來去滿足無線移動通訊的要求,而要充分的發揮無線移動通訊裝置的通訊能力,J2ME網路編程就變得尤為重要。

  一、使用Tomcat搭建Web伺服器

  
  圖1 網路應用程式模型

  絕大多數的網路應用都是將資料資訊儲存到DB Server(資料庫伺服器),通過Web Server協調各種用戶端的請求與響應,存取資料庫中的資料。資料庫伺服器和Web伺服器可能是網路中的1台或多台的裝置;用戶端可以通過網際中的通用協議(如http協議)對伺服器端進行訪問,用戶端或者是pc上的web瀏覽器,或者是行動裝置,只要能支援網路通訊的協議就應該能夠正確擷取伺服器端的資源。

  我們首先介紹一下使用Tomcat搭鍵web伺服器,在安裝Tomcat 5。0之前首先要下載

  j2sdk 、Tomcat 5.0的安裝檔案

  
  圖2 要準備的安裝檔案

  第1步安裝j2sdk 進入歡迎畫面

  
  圖3 j2SE安裝介面1

  第2步接受相關協議條款,然後選擇Next

  
  圖4 j2SE安裝介面2

  第3步 選擇安裝路徑,預設為c:\j2sdk1.4.2_05 ,這裡我們不變,選擇Next,(這個路徑很重要,如果我們改變了,一定要記住)。

  
  圖5 j2SE安裝介面3

  第4步 系統會自動拷貝檔案

  
  圖6 j2SE安裝介面4

  第5步 安裝完成 單擊finish。

  
  圖7 j2SE安裝介面5

  
  圖8 j2SE安裝之後的目錄結構

  第6步 安裝Tomcat 5.0,首先進入歡迎介面,單擊Next。

  
  圖9 Tomcat 安裝介面1

  第7步 接受相關協議條款,然後選擇Next

  
  圖10 Tomcat 安裝介面2

  第8步 選擇完整安裝Full,然後選擇Next

  

  圖11 Tomcat 安裝介面3

  第9步 確定安裝目錄,這裡我們確定為C:Tomcat 5.0,然後選擇Next

  
  圖12 Tomcat 安裝介面4

  第10步 確定Web伺服器管理員的使用者名稱和密碼以及預設的連接埠,,然後選擇Next

  使用者名稱 admin

  密碼 123 (要記住該密碼用於對伺服器的各種管理)

  預設連接埠 8080

  

  圖13 Tomcat 安裝介面5

  第11步 確定java虛擬機器的所在路徑,,然後選擇Next

  路徑 C:\j2sdk1.4.2_05 (和我們之前安裝JDK的路徑要一致)

  
  圖14 Tomcat 安裝介面6

  第12步 系統自動拷貝檔案。

  
  圖15 Tomcat 安裝介面7

  第13步 安裝完成,系統提示是否馬上運行,單擊Finish,我們會在螢幕的右下角看到Tomcat 5.0的小表徵圖。

  
  圖16 Tomcat 安裝介面7

  第14步 雙擊螢幕右下角Tomcat 5.0表徵圖,系統會彈出Tomcat運行視窗,在這個視窗中單擊Start開啟服務,到此Tomcat 5.0安裝完成,可以通過再Web瀏覽器中輸入http://127.0.0.1:8080 檢測到歡迎的畫面

  
  圖17 Tomcat 安裝介面8

  
  圖18 Tomcat 歡迎畫面

  安裝完成Tomcat以後,下面的工作就是要把磁碟上的檔案夾共用為互連網中的虛擬目錄,用於用戶端的訪問。我們在D:建立如下的檔案夾結構:

  D:mygameWeb (這個目錄將作為對外部的虛擬目錄用來存放共用的各種資源)

  
  圖19 虛擬目錄結構

  在瀏覽器中單擊頁面左上第三項 Tomcat Manager,這是系統會彈出一個視窗要求我們輸入Tomcat 管理的使用者名稱和密碼,輸入使用者名稱admin 密碼123 後,按確定進入Web伺服器管理頁面。

  
  圖20 使用者管理登陸視窗

  
  圖21 Tomcat 管理視窗

  在管理介面中的Deploy面板我們輸入以下資訊:

  Context Path(optional): /515game (虛擬目錄的名稱)

  XML Configuration file URL:

  WAR or Directory URL: file:d:/mygameWeb (真實的檔案夾注意格式和大小寫不要錯)

  填寫完成以後單擊 Deploy 發布虛擬目錄

  大功告成,我們可以把資源放到d:mygameWeb這個目錄下面通過

  http://IP地址:8080/515game/資源名稱就可以訪問這個伺服器上的資源了,

  如:http://127.0.0.1:8080/515game/myweb.html

  http://127.0.0.1:8080/515game/back0.png

  http://127.0.0.1:8080/515game/kk.wav

  假如這台主機在公網的IP地址為221.196.125.11 在互連網中可以過以下地址來訪問:

  http://221.196.125.11:8080/515game/myweb.html

  http://221.196.125.11:8080/515game/back0.png

  http://221.196.125.11:8080/515game/kk.wav

  在j2me中提供了訪問網路的相關類,封裝到了javax.microedition.io裡面提供了相關類,下面我們通過執行個體介紹如果通過GCF來讓j2me的用戶端擷取Web伺服器緞的資源。

  二、從Web擷取文字資訊

import javax.microedition.midlet.*;
import javax.microedition.io.*;
import java.io.*;
import javax.microedition.lcdui.*;

public class getHttp
extends MIDlet {
 public void startApp() {
  try {
   //開啟網路連接
   String url = "http://127.0.0.1/515game/myweb.html";
   StreamConnection sc = (StreamConnection) Connector.open(url);
   //讀取資料
   InputStream is = sc.openInputStream();
   int tmp = 0;
   String get = "";
   while (tmp != -1) { //-1代表結束
    tmp = is.read();
    get = get + (char) tmp;
   }
  is.close();
  Form f = new Form(url);
  //解決中文問題
  String chinese = new String(get.getBytes("iso8859-1"), "utf-8");
  f.append(chinese);
  Display.getDisplay(this).setCurrent(f);
  //關閉網路連接
  sc.close();
 }
 catch (Exception e) {}
}

public void pauseApp() {}
public void destroyApp(boolean f) {}
}
  三、從Web擷取圖片資訊

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.io.*;
import java.io.*;

public class testPic
extends MIDlet {
 public void startApp() {
  try {
   //開啟網路連接
   String url = "http://127.0.0.1/515game/back0.png";
   StreamConnection sc = (StreamConnection) Connector.open(url);
   //擷取圖片
   InputStream is = sc.openInputStream();
   Image im = Image.createImage(is);//該方法為MIDP 2.0方法
   Form f = new Form(url);
   f.append(im);
   Display.getDisplay(this).setCurrent(f);
   //關閉串連
   sc.close();
  }
  catch (Exception e) {}
 }
 public void pauseApp() {}
 public void destroyApp(boolean f) {}
}
  四、從Web擷取多媒體資訊

import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import javax.microedition.io.*;
import java.io.*;
import javax.microedition.media.*;

public class getMusic
extends MIDlet {
 public void startApp() {
  try {
   //開啟網路連接
   String url = "http://127.0.0.1/515game/kk.wav";
   StreamConnection sc = (StreamConnection) Connector.open(url);
   //擷取聲音
   InputStream is = sc.openInputStream();
   Player p1 = Manager.createPlayer(is, "audio/x-wav");
   p1.start();
   //關閉網路連接
   sc.close();
   System.out.println("sound is play");
  }
  catch (Exception e) {
   e.printStackTrace();
  }
 }
 public void pauseApp() {}
 public void destroyApp(boolean f) {}
}
  五、基於http的使用者登陸系統實現

伺服器端程式

checkuser.jsp 這個檔案放到d:/ mygameWeb目錄下面
<%
 //得到使用者名稱
 String name=request.getParameter("username");
 //得到密碼
 String pass=request.getParameter("password");
 if(name.equals("ldh"))
 {
  if(pass.equals("zhm"))
  {
   out.print("welcome ");
  }
  else
  {
   out.print("pass word error");
  }
 }
 else
 {
  out.print("user name error");
 }
%>

用戶端程式

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.io.*;
import java.io.*;
public class logoIN
extends MIDlet
implements CommandListener, Runnable {
 public Form f;
 public TextField user; //使用者名稱
 public TextField pass; //密碼
 public Command c1;
 public logoIN() {
  f = new Form("傳奇世界使用者登陸");
  user = new TextField("使用者名稱", "", 10, TextField.ANY);
  pass = new TextField("密碼", "", 8, TextField.PASSWORD);
  f.append(user);
  f.append(pass);
  c1 = new Command("確定", Command.SCREEN, 1);
  f.addCommand(c1);
  f.setCommandListener(this);
  Display.getDisplay(this).setCurrent(f);
 }
 public void startApp() {}
 public void pauseApp() {}
 public void destroyApp(boolean f) {}
 public void commandAction(Command c, Displayable dd) {
  Thread t = new Thread(this);
  t.start(); //啟動線程連結網路
 }
 //完成網路請求
 public void run() {
  try {
   //開啟網路
   String url = "http://127.0.0.1/515game/checkuser.jsp?username=" +
   user.getString() + "&password=" + pass.getString();
   //擷取資料
   StreamConnection sc = (StreamConnection) Connector.open(url);
   InputStream is = sc.openInputStream();
   int tmp = 0;
   String get = "";
   while ( (tmp = is.read()) != -1) {
    get = get + (char) tmp;
   }
   Form f2 = new Form("登陸結果");
   f2.append(get);
   Display.getDisplay(this).setCurrent(f2);
   //關閉網路
   sc.close();
  }
  catch (Exception e) {}
 }
}
  六、一個網路遊戲執行個體

  下面我們通過一個網路猜價格的遊戲執行個體來說明如何通過J2me同伺服器端交換資料。

  這是一個網路版商品競猜的執行個體,用戶端輸入商品價格,在伺服器端負責遊戲邏輯的處理。

  伺服器端代碼:

  Guess.jsp 這個檔案放到d:/ mygameWeb目錄下面

<%
 String sjg=request.getParameter("jg");
 int jg=(int)(Math.random()*10);
 int userjg=Integer.parseInt(sjg);
 if(userjg>jg)
 {
  out.println("sorry da le");
 }
 if(userjg<jg)
 {
  out.println("sorry xiao le");
 }
 if(userjg==jg)
 {
  out.println("right");
 }
%>

J2me用戶端代碼:

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.io.*;
import java.io.*;
public class GuessGame
extends MIDlet
implements CommandListener, Runnable {
 public Form f, f2;
 public TextField tf1;
 public Display d;
 public Command c1, c2;
 public GuessGame() {
  f = new Form("商品競猜");
  f2 = new Form("競猜結果");
  c2 = new Command("返回", Command.SCREEN, 1);
  f2.addCommand(c2);
  f2.setCommandListener(this);
  tf1 = new TextField("請輸入商品價格1-9", "", 1, TextField.NUMERIC);
  f.append(tf1);
  c1 = new Command("確定", Command.SCREEN, 1);
  f.addCommand(c1);
  f.setCommandListener(this);
  d = Display.getDisplay(this);
 }
 public void startApp() {
  d.setCurrent(f);
 }
 public void pauseApp() {}
 public void destroyApp(boolean f) {}
 public void commandAction(Command c, Displayable d) {
 if (c == c1) { //啟動網路請求
  (new Thread(this)).start();
 }
 if (c == c2) {
  this.d.setCurrent(f);
 }
}

public void run() {
 try {
  //開啟網路連接
  String url = "http://127.0.0.1/515game/Guess.jsp?jg="+ tf1.getString();
  StreamConnection sc = (StreamConnection) Connector.open(url);
  //擷取請求結果
  InputStream is = sc.openInputStream();
  int tmp = 0;
  String get = "";
  while ( (tmp = is.read()) != -1) {
   get = get + (char) (tmp);
  }
  for (int i = 0; i < f2.size(); i++) {
   f2.delete(i);
  }
  f2.append(get);
  d.setCurrent(f2);
  //關閉網路連接
  sc.close();
 }
 catch (Exception e) {}
}
}

相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。