日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式教程
[導(dǎo)讀]開(kāi)發(fā)MIDP聯(lián)網(wǎng)應(yīng)用程序

♦引言

在上講中,我們介紹了如何利用RecordStore把數(shù)據(jù)保存在終端內(nèi)。本講,我們將闡述MIDPJAVA網(wǎng)絡(luò)的相關(guān)功能。由于N800終端只能使用HTTP通信,所以我們將以HTTP為主要范例進(jìn)行講解。到目前為止,只能制作終端內(nèi)的單機(jī)型應(yīng)用程序,如果利用網(wǎng)絡(luò),連接網(wǎng)絡(luò)服務(wù)器,那么就能夠制作出多種應(yīng)用程序。

1.利用網(wǎng)絡(luò)

1.1.GenericConnectionFrameWork

J2ME應(yīng)該能支持各種手機(jī)終端。由于終端不同其網(wǎng)絡(luò)功能及文件I/O功能也迥然不同,網(wǎng)絡(luò)和文件I/O關(guān)聯(lián)的圖書(shū)館所需的條件也不同。

為了解決上述問(wèn)題,JSME的CLDC采用了GenericConnectionframework。GenericConnectionframework擁有不同終端所需的省空間網(wǎng)絡(luò)功能以及文件I/O功能。廣泛應(yīng)用J2SE的java.io和java.net包里的網(wǎng)絡(luò)、文件I/O功能,并準(zhǔn)備7個(gè)interface。這樣,為能支持各種手機(jī)終端的通信功能,只限定interface,在每個(gè)手機(jī)終端上都能自由安裝。不支持手機(jī)終端連接的實(shí)際安裝不能進(jìn)行。各種interface的說(shuō)明如表1所示、層次結(jié)構(gòu)如圖1所示。

點(diǎn)擊圖片看大圖

表1

圖1

1.2.ConnectionInterface

Connectioninterface在GenericConnectionframework中是連接interface的基礎(chǔ)interface。其他的連接interface是從Connectioninterface派生而來(lái)的。

1.3.Connector類

使用Connector類的static方法open(StringconnectString)入網(wǎng)。

Connectioncon=Connector.open("http://www.nec-mfriend.com/");

ex.1

例如、如ex.1所示,在open方法的自變量中輸入“http://www.nec-mfiend.com/”,就可以實(shí)現(xiàn)與www.nec-mfriend.com服務(wù)器進(jìn)行http通信。

而GenericConnectionframework的全部鏈接都是利用Connector類的open方法完成的。也就是說(shuō),即使鏈接類型不同,也能以同樣的方法完成。J2ME由于這樣的設(shè)計(jì)而擁有豐富的擴(kuò)展性,對(duì)于上述新的裝置它也配備了簡(jiǎn)單的支持系統(tǒng)。

按照下述形式指定Open方法的自變量。

{protocol}:[{target}][{params}]

在Protocol部分可以指定如下所示的Protocol。

表2

*N800不支持socket通信、數(shù)據(jù)電報(bào)通信,而N820支持socket通信。

在Target部分指定服務(wù)器的用戶名、端口號(hào)和文件名等。若有必要的添加信息則在Params部分指定。

Open方法也可以指定其他的自變量。

staticConnectionopen(StringconnectString,intmode)

從connectString中制作Connection、打開(kāi)鏈接,若要使用mode鏈接則需指定accessmode。在accessmode中,可以指定Connector.READ,Connector.READ_WRITE和Connector.WRITE,若不指定,則為Connector.READ_WRITE。在Protocol中不能指定accessmode時(shí),則放棄IllegalArgumentException。

下表是其他Connector類的static方法。

1.4.HTTP通信

現(xiàn)在,我們對(duì)N800所支持的HTTP通信進(jìn)行闡述。利用HTTP通信可以連接WEB服務(wù)器。例如,可以把手機(jī)終端難以處理的復(fù)雜問(wèn)題交給WEB服務(wù)器處理,得出結(jié)果。HTTP通信采用MIDP方法作為標(biāo)準(zhǔn),但是,采用MIDP作為基本方法的終端卻不能進(jìn)行HTTP通信,或者有很大的限制,這一點(diǎn)請(qǐng)注意。

為能在N800中使用HTTP通信需遵從以下規(guī)定。

•要實(shí)現(xiàn)MIDlet通信必須在JAD(ADF)文件中設(shè)定MIDlet-UseNetwork(參考3.JAD(ADF)文件)為YES。.

•最大發(fā)送量為10kbyte。

大于10kbyte時(shí),超出部分被清除,小于10kbyte的數(shù)據(jù)才是有效的。

•最大接收量為100kbyte。

大于100kbyte時(shí),超出部分被清除,小于100kbyte的數(shù)據(jù)才是有效的。

•連接處URL

從http://開(kāi)始,包含http://,最多為512byte。不分大/小寫(xiě)。

HTTP通信由request和response兩部分組成。從客戶發(fā)出的request信息傳到服務(wù)器,服務(wù)器接收request,返還response信息。

HTTP通信主要有下述三種request方式。

接下來(lái),讓我們?cè)囍枚喾Nrequest與服務(wù)器進(jìn)行通信。

1.5.利用GET

利用GET可以讀取服務(wù)器上的文件。在使用GET之前,如下所示需在已完成的HttpConnection方法的setRequestMethod方法中,指定HttpConnection的static變數(shù)GET。

HttpConnectioncon=(HttpConnection)Connector.open("http://www.nec-mfriend.com/");

con.setRequestMethod(HttpConnection.GET);

ex.2

如下所示可以利用DataInputStream獲取response。

Stringres="";

DataInputStreamin=con.openDataInputStream();

intinput;

while((input=in.read())!=-1){

res=res+(char)input;

}

in.close();

ex.3

以下實(shí)際是與服務(wù)器通信,獲取html文件的sample。為簡(jiǎn)單介紹sample的操作,得把通信結(jié)果,即獲取的html文件內(nèi)容,輸入控制臺(tái)。因此,此sample是以在模擬器上面操作為前提的。

importjava.io.DataInputStream;

importjava.io.IOException;[!--empirenews.page--]

importjavax.microedition.io.Connector;

importjavax.microedition.io.HttpConnection;

importjavax.microedition.midlet.MIDlet;

importjavax.microedition.midlet.MIDletStateChangeException;

/**

*利用GET發(fā)送request的sample

*從控制臺(tái)輸出response

*/

publicclassGETTestextendsMIDlet{

/**

*訪問(wèn)服務(wù)器

*/

protectedvoidstartApp()throwsMIDletStateChangeException{

try{

HttpConnectioncon=(HttpConnection)Connector.open("http://www.nec-mfriend.com/en/");

//指定GET

con.setRequestMethod(HttpConnection.GET);

DataInputStreamin=con.openDataInputStream();

intinput;

while((input=in.read())!=-1){

System.out.print((char)input);

}

in.close();

//關(guān)閉鏈接

con.close();

}catch(IOExceptione){

e.printStackTrace();

}

}

protectedvoidpauseApp(){

}

protectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeException{

}

}

ex.4

實(shí)際操作后的結(jié)果。

1.6.利用HEAD

接下來(lái)介紹如何利用HEAD方法獲取文件的header。多數(shù)情況下,在HTTPheader中,包含了文件種類、尺寸大小、文字編碼、回復(fù)日期、request文件的最后修改時(shí)間、以及兌現(xiàn)期限的截止日期等。一般來(lái)講,使用HEAD方法檢查其是否對(duì)兌現(xiàn)內(nèi)容進(jìn)行了新信息的替換。

為使用HEAD,如下所示要在作成的HttpConnection的setRequestMethod方法中,指定HttpConnection的static變量HEAD。

HttpConnectioncon=(HttpConnection)Connector.open("http://www.nec-mfriend.com/en/");

con.setRequestMethod(HttpConnection.HEAD);

獲取HEAD信息的方法。

表3

下面是利用getHeaderField方法和getHeaderFieldKey方法,獲取全部header信息的sample。這個(gè)sample與剛才所介紹的一樣,是以在模擬器上進(jìn)行操作為前提而作成的,它只用于說(shuō)明,實(shí)際操作還沒(méi)有進(jìn)行測(cè)定。由此獲取的全部header信息內(nèi)容將輸入控制臺(tái)。

importjava.io.IOException;

importjavax.microedition.io.Connector;

importjavax.microedition.io.HttpConnection;

importjavax.microedition.midlet.MIDlet;

importjavax.microedition.midlet.MIDletStateChangeException;

/**

*利用HEAD發(fā)送request的sample

*從控制臺(tái)輸出response

*/

publicclassHEADTestextendsMIDlet{

/**

*顯示header信息

*/

protectedvoidstartApp()throwsMIDletStateChangeException{

try{

HttpConnectioncon=

(HttpConnection)Connector.open("http://www.nec-mfriend.com/en/");

//指定HEAD

con.setRequestMethod(HttpConnection.HEAD);

//取得關(guān)鍵的HTTPheader信息——成對(duì)的值

inti=0;

Stringmessage="";

Stringkey="";

Stringvalue="";

while((value=con.getHeaderField(i))!=null){

key=con.getHeaderFieldKey(i++);

message=message+key+":"+value+"n";

}

System.out.println(message);

//關(guān)閉鏈接

con.close();

}catch(IOExceptione){

e.printStackTrace();

}

}

protectedvoidpauseApp(){

}

protectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeException{

}

}

ex.5

實(shí)際操作后的結(jié)果如下所示。

圖3

1.7.利用POST

為能利用POST發(fā)送request,要使用InputStream和OutputStream。用OutputStream向服務(wù)器發(fā)送數(shù)據(jù),而InputStream則接收來(lái)自服務(wù)器的response。

用下述方法指定POST。

HttpConnectioncon=(HttpConnection)Connector.open("http://www.yahoo.com");

con.setRequestMethod(HttpConnection.POST);

ex.6

如下所示使用OutputStream在requeat信息中輸入數(shù)據(jù),使輸入數(shù)據(jù)為(message=helloworld),而變量con是指定了POST的HttpConnection。

Stringmessage=乭message=helloworld乭;

DataOutputStreamdos=con.openDataOutputStream();

byte[]request=message.getBytes();

for(inti=0;i

dos.writeByte(request[i]);

}

dos.flush();

ex.7

下面實(shí)際是利用POST與服務(wù)器進(jìn)行通信的sample。在這里,WEB服務(wù)器將轉(zhuǎn)發(fā)利用POST發(fā)送的信息值,并接收最終結(jié)果response。接收的response內(nèi)容將被輸入控制臺(tái),請(qǐng)用模擬器進(jìn)行確認(rèn)。

importjava.io.DataInputStream;

importjava.io.DataOutputStream;

importjava.io.IOException;

importjavax.microedition.io.Connector;

importjavax.microedition.io.HttpConnection;

importjavax.microedition.midlet.MIDlet;

importjavax.microedition.midlet.MIDletStateChangeException;

/**

*利用POST發(fā)送request的sample[!--empirenews.page--]

*從控制臺(tái)輸出response

*/

publicclassPOSTTestextendsMIDlet{

/**

*利用POST送信息

*/

protectedvoidstartApp()throwsMIDletStateChangeException{

try{

HttpConnectioncon=(HttpConnection)Connector.open("http://localhost:8080/nec_server/servlet/ReverseServlet");

//指定POST

con.setRequestMethod(HttpConnection.POST);

//在request中輸入數(shù)據(jù)

Stringmessage="message=helloworld";

DataOutputStreamdos=con.openDataOutputStream();

byte[]messageByte=message.getBytes();

for(inti=0;i

dos.writeByte(messageByte[i]);

}

dos.flush();

dos.close();

//接收response

DataInputStreamin=con.openDataInputStream();

intinput;

while((input=in.read())!=-1){

System.out.print((char)input);

}

in.close();

//關(guān)閉鏈接

con.close();

}catch(IOExceptione){

e.printStackTrace();

}

}

protectedvoidpauseApp(){

}

protectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeException{

}

}

ex.8

接下來(lái)介紹本次使用的SERVLETsample,作為服務(wù)器實(shí)際安裝的例子。因?yàn)楸局v座是MIDP講座,所以關(guān)于SERVLET的詳細(xì)說(shuō)明就不再贅述,網(wǎng)上有許多這方面的信息,請(qǐng)大家參考Sun—http://java.sun.com/products/servlet/等網(wǎng)站。

importjava.io.IOException;

importjava.io.PrintWriter;

importjavax.servlet.ServletException;

importjavax.servlet.http.HttpServlet;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

/**

*把接收的文字列進(jìn)行轉(zhuǎn)發(fā)的SERVLET

*/

publicclassReverseServletextendsHttpServlet{

/**

*處理postrequest

*/

protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseres)

throwsServletException,IOException{

//接收參數(shù)

Stringmessage=req.getParameter("message");

//轉(zhuǎn)發(fā)文字

Stringreverse="";

for(inti=message.length();i>0;i--){

reverse=reverse+message.charAt(i-1);

}

//寫(xiě)response

PrintWriterout=res.getWriter();

out.write("

n");

 

 

 

out.write("

n");

 

 

 

out.write("

n");

out.write("n");

out.write("

n");

out.write("messageis"+message+"
n");

out.write("ReverseMessageis"+reverse+"n");

out.write("

n");

out.write("");

out.close();

}

}

ex.9

實(shí)際操作如下所示:

2

2.制作應(yīng)用程序

現(xiàn)在,我們介紹如何實(shí)際制作利用HTTP通信的應(yīng)用程序。這次增添了以前所作的泡泡龍游戲(BlockApplication)的內(nèi)容,并把游戲結(jié)束的時(shí)間作成高低分一覽表,由服務(wù)器管理。為了使程序更簡(jiǎn)單,還省略了與聲音相關(guān)的操作。以下是內(nèi)容改變前的sourcecode:

 

BlockApplication.java

BlockCanvas.java

給這個(gè)程序添加

•計(jì)算結(jié)束時(shí)間功能。

•向服務(wù)器發(fā)送時(shí)間表功能。

•從服務(wù)器接收最高分功能。

通過(guò)游戲或游戲結(jié)束時(shí),顯示出最高分。

為了計(jì)算Http通信和時(shí)間表,給實(shí)際變量添加以下變量:

//相關(guān)經(jīng)過(guò)時(shí)間

privateintsecond=0;

privatelongstartMs;

//http通信類

privatefinalStringSERVER_URL=

"http://localhost:8080/nec_server/servlet/BlockScoreServlet";//服務(wù)器的UPL

privateString[]highscore=null;//最高分

ex.10

2.1.計(jì)算結(jié)束時(shí)間

為了計(jì)算結(jié)束時(shí)間,要記錄游戲開(kāi)始時(shí)的系統(tǒng)時(shí)間(startMs),以這個(gè)時(shí)間為準(zhǔn)計(jì)算經(jīng)過(guò)時(shí)間,如下畫(huà)面所示:

/*****************************************

*計(jì)時(shí)器相關(guān)處理

*****************************************/

/**

*計(jì)算經(jīng)過(guò)時(shí)間

*/

publicintgetSecond(){

return(int)((System.currentTimeMillis()-startMs)/1000);

}

ex.11

2.2.向服務(wù)器發(fā)送時(shí)間表,接收最高分

如上所述,游戲結(jié)束時(shí)顯示最高分。但是,游戲結(jié)束時(shí)向服務(wù)器發(fā)送時(shí)間表,而通過(guò)游戲時(shí)不發(fā)送時(shí)間表,只顯示最高分。[!--empirenews.page--]

為在通過(guò)游戲時(shí)顯示最高分,要與服務(wù)器進(jìn)行通信,由此獲得最高分。這里,可以用我們介紹的HttpConnection,利用GET取得最高分??梢栽谟螒蚪Y(jié)束時(shí)使用以下方法。

/**

*與服務(wù)器進(jìn)行通信,獲取最高分。

*/

publicString[]getHighScore(){

String[]str=newString[5];

HttpConnectioncon=null;

DataInputStreamin=null;

try{

con=(HttpConnection)Connector.open(SERVER_URL);

//接收response

in=con.openDataInputStream();

intinput;

inti=0;

Strings="";

while((input=in.read())!=-1){

if((char)input==‘n‘){

str[i]=s;

i++;

s="";

continue;

}

s=s+(char)input;

}

}catch(IOExceptione){

e.printStackTrace();

}finally{

if(con!=null){

try{

con.close();

}catch(IOExceptione1){

e1.printStackTrace();

}

}

if(in!=null){

try{

in.close();

}catch(IOExceptione1){

e1.printStackTrace();

}

}

}

returnstr;

}

ex.12

下面是進(jìn)行游戲時(shí)的操作。結(jié)束游戲時(shí)向服務(wù)器發(fā)送結(jié)束時(shí)間,即利用POST如下所示發(fā)送結(jié)束時(shí)間。然后,接收來(lái)自服務(wù)器的response最高分。可以在游戲結(jié)束時(shí)使用以下方法。

/**

*向服務(wù)器發(fā)送時(shí)間表,取得最高分

*/

publicString[]sendScore(){

String[]str=newString[5];

HttpConnectioncon=null;

DataOutputStreamout=null;

DataInputStreamin=null;

try{

con=(HttpConnection)Connector.open(SERVER_URL);

con.setRequestMethod(HttpConnection.POST);

out=con.openDataOutputStream();

//向服務(wù)器發(fā)送時(shí)間表

Stringmessage="score="+second;

byte[]messageByte=message.getBytes();

for(inti=0;i

out.writeByte(messageByte[i]);

}

out.close();

//接收response

in=con.openDataInputStream();

intinput;

inti=0;

Strings="";

while((input=in.read())!=-1){

if((char)input==‘n‘){

str[i]=s;

i++;

s="";

continue;

}

s=s+(char)input;

}

}catch(IOExceptione){

e.printStackTrace();

}finally{

if(con!=null){

try{

con.close();

}catch(IOExceptione1){

e1.printStackTrace();

}

}

if(out!=null){

try{

out.close();

}catch(IOExceptione1){

e1.printStackTrace();

}

}

if(in!=null){

try{

in.close();

}catch(IOExceptione1){

e1.printStackTrace();

}

}

}

returnstr;

}

ex.13

2.3.顯示最高分

通過(guò)游戲和游戲結(jié)束時(shí),都顯示最高分。用以下方法顯示最高分:

/**

*顯示最高分

*/

publicvoidpaintHighScore(Graphicsg){

for(inti=0;i

if(highscore[i]==null)break;

g.drawString(

highscore[i],

10,

10+i*15,

Graphics.LEFT|Graphics.TOP);

}

}

ex.14

2.4.運(yùn)行

完成的sourcecode如下:

•BlockApplication.java

•BlockCanvas.java

另外,服務(wù)器使用的SERVLET的sourcecode式如下:

•nec_server.zip

運(yùn)行后的結(jié)果如下:

3.總結(jié)

本講中,介紹了可以利用HTTP通信進(jìn)行網(wǎng)絡(luò)編程。利用本講介紹的東西,能夠制作簡(jiǎn)單的chat程序以及聯(lián)網(wǎng)作戰(zhàn)游戲等應(yīng)用程序。請(qǐng)大家也試著制作一些新的獨(dú)特的應(yīng)用程序吧。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

多數(shù)受訪粉絲認(rèn)為,AI驅(qū)動(dòng)的功能會(huì)對(duì)他們觀看體育賽事的方式產(chǎn)生重大影響 超過(guò)半數(shù)的受訪者希望通過(guò)AI技術(shù)獲得對(duì)過(guò)去、現(xiàn)在和未來(lái)體育賽事的評(píng)論和分析 移動(dòng)體育應(yīng)用...

關(guān)鍵字: IBM AI 應(yīng)用程序 移動(dòng)

廈門2025年7月17日 /美通社/ -- 7月15日下午,TÜV南德意志集團(tuán)(以下簡(jiǎn)稱"TÜV南德")與廈門億聯(lián)網(wǎng)絡(luò)技術(shù)股份有限公司...

關(guān)鍵字: 通信設(shè)備 聯(lián)網(wǎng) 網(wǎng)絡(luò) 可持續(xù)發(fā)展

青島 2025年5月23日 /美通社/ -- 全球領(lǐng)先的消費(fèi)電子和家電品牌海信今天宣布將谷歌全新Home API集成至其ConnectLife應(yīng)用程序。今年秋季前,用戶可通過(guò)該應(yīng)用程序?qū)⒌谌街悄芗揖釉O(shè)備接入Conne...

關(guān)鍵字: API NEC 海信 應(yīng)用程序

-Arya.ai推出MCP應(yīng)用程序,將通用LLM轉(zhuǎn)化為特定領(lǐng)域?qū)<? 印度孟買和紐約 2025年5月13日 /美通社/ -- Arya.ai今天宣布推出APEX MCP(模...

關(guān)鍵字: MCP 應(yīng)用程序 AI 人工智能

北京2025年1月15日 /美通社/ -- 2025年1月8日,STIF第五屆國(guó)際科創(chuàng)節(jié)暨新質(zhì)生產(chǎn)力領(lǐng)航者峰會(huì)在北京舉行。作為科技創(chuàng)新與數(shù)字化服務(wù)領(lǐng)域最具影響力的年度盛會(huì)之一,本屆大會(huì)匯聚全球科創(chuàng)品牌,旨在通過(guò)構(gòu)建多元、...

關(guān)鍵字: 數(shù)字化 APP 互聯(lián)網(wǎng) 應(yīng)用程序

推動(dòng)技術(shù)創(chuàng)新與業(yè)務(wù)增長(zhǎng) 北京2024年12月19日 /美通社/ -- 在亞馬遜云科技2024 re:Invent全球大會(huì)上,亞馬遜云科技與東南亞領(lǐng)先的超級(jí)應(yīng)用程序Grab共同宣布,Grab已選擇亞馬遜云科技為首選云服務(wù)...

關(guān)鍵字: 亞馬遜 應(yīng)用程序 云服務(wù) AI技術(shù)

Amazon Aurora DSQL是一款性能卓越的分布式SQL數(shù)據(jù)庫(kù),具備99.999%的多區(qū)域可用性、幾乎無(wú)限的可擴(kuò)展性、強(qiáng)一致性,且完全消除了基礎(chǔ)設(shè)施管理的負(fù)擔(dān)。 北京2024年12月13日 /美通社/ -- 亞...

關(guān)鍵字: 亞馬遜 分布式 SQL數(shù)據(jù)庫(kù) 應(yīng)用程序

為數(shù)據(jù)、分析和AI提供統(tǒng)一平臺(tái) 北京2024年12月10日 /美通社/ -- 亞馬遜云科技在2024 re:Invent全球大會(huì)上,宣布推出新一代Amazon SageMaker,將客戶所需的快速SQL分析、PB級(jí)大數(shù)...

關(guān)鍵字: 亞馬遜 MAKER GE 應(yīng)用程序

當(dāng)要傳遞給Lambda體的操作,已經(jīng)有實(shí)現(xiàn)的方法了,可以使用方法引用!這里需要注意的是:實(shí)現(xiàn)抽象方法的參數(shù)列表,必須與方法引用方法的參數(shù)列表保持一致!

關(guān)鍵字: JAVA BSP

隨著嵌入式系統(tǒng)的發(fā)展,從裸機(jī)應(yīng)用程序遷移到實(shí)時(shí)操作系統(tǒng)(RTOS)已成為提升系統(tǒng)性能、可靠性和可維護(hù)性的重要趨勢(shì)。RTOS為多任務(wù)處理、資源管理和實(shí)時(shí)響應(yīng)提供了強(qiáng)大的支持,使得開(kāi)發(fā)者能夠構(gòu)建更復(fù)雜、更高效的系統(tǒng)。本文將深...

關(guān)鍵字: RTOS 應(yīng)用程序
關(guān)閉