关于我们 广告服务 社区论坛
设为首页 加入收藏

行业新闻
服 务 器
模版下载
建站指南
冲浪宝典
办公软件
网站运营
操作系统
QQ 专题
网页制作
安全防御
视频教程
网络编程
SEO专区
软件下载
图像设计
Cisco
网页特效
Wap 技术
联盟赚钱
网页素材
 首页 | 企业建站 | 网页制作 | 网站运营 | 网络编程 | 图像设计 | 冲浪宝典 | 操作系统 | SEO专区 | 联盟赚钱 | Cisco

欢迎来到e天下网络首页>>Wap技术>>J2ME技术>>正文|小议手机与Servlet的网络通信技巧

小议手机与Servlet的网络通信技巧

[ 来路:网络    时间:2007-7-11 16:43:36    点击: ]

 

  随着越来越多手提电话和个人数字助理开始融入到信息高速公路之上,从移动设备上访问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 = dis.readUTF();
String tf2Str = dis.readUTF(); 
System.out.println
("servlet端接收到手机传来的第一个参数为:
" + tf1Str); 
// 主要起调试的作用,
调试的结果显示在tomcat的启动DOS窗口中 
System.out.println
("servlet端接收到手机传来的第二个参数为:
" + tf2Str); 
//对接收的参数进行处理 
String return1Str =
tf1Str.concat(":早上好!"); 
//在接收到的参数后连接字符串 
String return2Str =
tf2Str.concat(":晚上好!"); 
//发送处理后的参数给手机 
DataOutputStream dos = 
new DataOutputStream
(response.getOutputStream()); 
dos.writeUTF(return1Str);
dos.writeUTF(return2Str); 
System.out.println
("servlet传递给手机的第一个参数为:"
+ return1Str); 
System.out.println
("servlet传递给手机的第二个参数为:"
+ return2Str); 

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

doGet(request,response); 

public void destroy()
{

//清除资源 
}

::::站长友情提示:多花一分钟学点什么都好::::

 

上一篇:优化J2ME中的paint()函数  下一篇:基于MIDP1.0实现RMS容量探测器

 ::热点信息::

 

= = 免责声明 = =

① 欢迎转载我网所刊信息,请注明“来源:E天下网络”。
② 凡本网注明“来源:XXX(非E天下网络)”的作品,均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如因作品内容、版权和其它问题需要同本网联系的,请在30日内进行。
※联系方式:Airtofly@163.com

::推荐文章::

 

应该如何建设支持3G的光传输网

::图像设计::

 

动态图片搜索家——GIF RUNN
软件搜索利器——FileFerret
实例说明构图要讲规律
Character Builder让你尽展靓
全景图速成者Cool360
三维模型速成工具——Canoma
剪贴专家SmartBoard 32
新世纪的图像处理利器——Ph
更多内容..

 

 

关于我们 广告服务 友情链接 合作伙伴 社区论坛 免责声明

Copyright © 2007   21kn.com Inc. All rights reserved.e天下网络工作室

网站白天客服QQ:26875416 (非24小时)  合作QQ:597004688    粤ICP备06026423号