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

J2ME網絡編程以及網絡游戲的實現

編輯:關於JAVA

引言

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) {}
}
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved