WAP之家:为您提供最全最新的WAP技术,CP.SP.3G等行业资讯。 WAP之家交流论坛全新开放 点击进入>>
WAP资讯 | 3G动态 | SP动态 | 运营商动态 | 内容商动态 | 制造商动态 | 论坛讨论>> 每次自动访问
WAP技术 | WAP源码 | 手机编程 | 手机源码 | 无线技术 | J2ME技术 | 手机软件 添加到收藏夹
IVR技术 | SP资料 | SMS MMS技术 | 商业方案 | IVR下载 | 书籍教程 | 工具软件 语言:繁體中文

WAP之家技术文章J2ME技术程序开发小议手机与Servlet的网络通信技巧

小议手机与Servlet的网络通信技巧
作者:未知  来源:java-cn.com  发布时间:2005-7-29 9:30:25
随着越来越多手提电话和个人数字助理开始融入到信息高速公路之上,从移动设备上访问Web站点变得越来越重要。只有你实现移动设备与非移动设备互相通信的功能后,你设计的移动设备应用程序才可以称的上是真正有用的。

在本文中,我们将通过一个简单的例子来学习如何实现手机与Servlet的网络通信。该程序经tomcat4.0.6、J2ME的MIDP简表及SUN的J2ME的无线应用程序开发工具包编译、配置和测试通过,同时在手机模拟器上中文显示正常。

一些参考书都讲了J2ME的网络编程,但我感觉大都有点雷同,并且很少有完整的手机客户端程序以及Servlet服务器端程序,虽然手机与Servlet通信的方法有多种,但经实践与比较,我觉得手机和Servlet通信比较简单的方法就是DataInputStream.readUTF和DataOutputStream.writeUTF的配对使用,比如手机发送数据可以在Connection的输出流中用DataOutputStream.writeUTF依次写入多个参数,相对应的,Servlet打开请求的输入流(request.getInputStream)用DataInputStream.readUTF来依次读出。

返回的参数也一样,Servlet用response.getOutputStream打开输出流,并把返回值依次写入,手机端打开Connection的输出流并读出即可。至于多个参数多个返回值都是没有问题的,只是多次使用writeUTF和readUTF罢了。读者可以参考程序中的注释,以及运行结果来理解手机与Servlet是如何传递与返回参数的以及是如何来进行网络通信的。

手机客户端:


import javax.microedition.midlet.*; 
import javax.microedition.lcdui.*; 
import javax.microedition.io.*; 
import java.io.*; 
public class ClientApp extends
MIDlet implements CommandListener 

Display display; TextField tf1,
tf2; String tf1Str,tf2Str; 
Form inputForm,returnForm; 
Command cmdSend,cmdBack; 
final static String defaultURL = 
"http://localhost:8080/examples
/servlet/ServletApp"; 
public ClientApp() 

display = Display.getDisplay(this); 
tf1 = new TextField("input first param:",
"卢东方",20,TextField.ANY); 
tf2 = new TextField("input second param:",
"王桃群",20,TextField.ANY); 
cmdSend = new Command("Send",Command.SCREEN,1); 
cmdBack = new Command("Back",Command.SCREEN,1); 
inputForm = new Form("pls input the param:"); 
inputForm.append(tf1); inputForm.append(tf2); 
inputForm.addCommand(cmdSend); 
inputForm.setCommandListener(this); 

public void startApp()
throws MIDletStateChangeException 

display.setCurrent(inputForm); 

public void invokeServlet(String url)
throws IOException 

HttpConnection hc = null; 
DataOutputStream dos = null; 
DataInputStream dis = null; 
try{ 
hc = (HttpConnection)Connector.open
(url,Connector.READ_WRITE); 
//设置请求属性 
hc.setRequestMethod(HttpConnection.POST); 
//设置为POST请求方式,默认的请求方式是GET 
hc.setRequestProperty
("IF-Modified-Since","15 Oct 
2003 08:47:14 GMT"); 
hc.setRequestProperty("User-Agent",
"Profile/MIDP-1.0 Configuration/CLDC-1.0"); 
hc.setRequestProperty
("Content-Language","en-CA"); 
hc.setRequestProperty
("Content-Type","application
/x-www-form-urlencoded"); 
hc.setRequestProperty
("Connection","Keep-Alive"); 
//Connection头可以控制MIDlet
和Web服务器之间保持"keep alive"特色。 
"keep alive"特色是指在MIDlet
和Web服务器间始终使用同一个HTTP连接来多次传递数据 
(在通常情况下,HTTP是无连接的协议,
每次数据传输完毕后都将断开连接, 
而下次传递数据之前将重新建立连接) 
//发送请求参数到servlet 
dos = hc.openDataOutputStream(); 
dos.writeUTF(tf1Str); 
dos.writeUTF(tf2Str); 
//用于发送请求参数给servlet 
System.out.println
("手机传递给servlet的第一个参数为:"+ tf1Str); 
//主要起调试的作用,
调试的结果将显示在WTK的控制台中 
System.out.println
("手机传递给servlet的第一个参数为:"+ tf2Str); 
dos.flush(); dos.close(); 
//接收servlet响应数据 
ds = new DataInputStream
(hc.openInputStream()); 
String return1Str = dis.readUTF();
String return2Str = dis.readUTF(); 
System.out.println
("手机接收到servlet端传来的第一个参数为:"
+ return1Str); 
//主要起调试的作用,
调试的结果将显示在WTK的控制台中 
System.out.println
("手机接收到servlet端传来的第二个参数为:
" + return2Str); 
returnForm = new Form("返回的结果"); 
returnForm.append(return1Str);
returnForm.append("\n"); 
//将返回的结果append到resultForm中 
returnForm.append(return2Str); 
returnForm.addCommand(cmdBack); 
returnForm.setCommandListener(this); 
}finally{ 
if (dis != null) {dis.close();
}
if (dos != null) {dos.close();

if (hc != null) {hc.close();


display.setCurrent(returnForm); 

public void pauseApp()
{

public void destroyApp
(boolean unconditional)
{

public void commandAction
(Command c,Displayable d)

if(c == cmdBack){display.setCurrent(inputForm);

if(c == cmdSend){tf1Str = 
tf1.getString(); tf2Str = 
tf2.getString(); 
try{ invokeServlet(defaultURL); 
}catch(Exception e)
{
System.out.println(e.getMessage());



}




Servlet服务器: 


import java.io.*; 
import java.sql.*; 
import javax.servlet.*; 
import javax.servlet.http.*; 
public class ServletApp extends HttpServlet

public void doGet
(HttpServletRequest request,
HttpServletResponse response) 
throws IOException,ServletException 

response.setContentType
("text/html; charset=GBK"); 
//设置响应属性 
//接收客户端的请求 
InputStream is = 
request.getInputStream(); 
DataInputStream dis = 
new DataInputStream(is); 
String tf1Str

[1] [2]  下一页

[] [返回上一页] [打 印]
文章评论

用户名: 查看更多评论

分 值:100分 85分 70分 55分 40分 25分 10分 0分

内 容:

         (注“”为必填内容。) 验证码: 验证码,看不清楚?请点击刷新验证码