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的安裝文件
第1步安裝j2sdk 進進歡迎畫面
第2步接收相干協議條款,然後選擇Next
第3步 選擇安裝路徑,默認為c:\j2sdk1.4.2_05 ,這裡我們不變,選擇Next,(這個路徑很重要,假如我們轉變了,必定要記住)。
第4步 系統會主動拷貝文件
第5步 安裝完成 單擊finish。
第6步 安裝Tomcat 5.0,首先進進歡迎界面,單擊Next。
第7步 接收相干協議條款,然後選擇Next
第8步 選擇完整安裝Full,然後選擇Nextt 安裝界面2
第9步 斷定安裝目錄,這裡我們斷定為C:Tomcat 5.0,然後選擇Next
第10步 斷定Web服務器治理員的用戶名和密碼以及默認的端口,,然後選擇Next
用戶名 admin
密碼 123 (要記住該密碼用於對服務器的各種治理)
默認端口 8080
第11步 斷定Java虛擬機的所在路徑,,然後選擇Next
路徑 C:\j2sdk1.4.2_05 (和我們之前安裝JDK的路徑要一致)
第12步 系統主動拷貝文件。
第13步 安裝完成,系統提示是否馬上運行,單擊Finish,我們會在屏幕的右下角看到Tomcat 5.0的小圖標。
第14步 雙擊屏幕右下角Tomcat 5.0圖標,系統會彈出Tomcat運行窗口,在這個窗口中單擊Start開啟服務,到此Tomcat 5.0安裝完成,可以通過再Web浏覽器中輸進http://127.0.0.1:8080 檢測到歡迎的畫面
安裝完成Tomcat以後,下面的工作就是要把磁盤上的文件夾共享為互聯網中的虛擬目錄,用於客戶真個拜訪。我們在D:創立如下的文件夾結構:
D:mygameWeb (這個目錄將作為對外部的虛擬目錄用來存放共享的各種資源)
在浏覽器中單擊頁面左上第三項 Tomcat Manager,這是系統會彈出一個窗口請求我們輸進Tomcat 治理的用戶名和密碼,輸進用戶名admin 密碼123 後,按斷定進進Web服務器治理頁面。
在治理界面中的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/kk.wav
假如這台主機在公網的IP地址為221.196.125.11 在互聯網中可以過以下地址來拜訪:
http://221.196.125.11:8080/515game/myweb.Html
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 = "/School/UploadFiles_7810/201105/20110520224403455.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) {}
}
}