中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Java > J2ME
小议手机与Servlet的网络通信技巧
作者:佚名 时间:2006-09-22 09:21 出处:java-cn 责编:月夜寒箫
              摘要:小议手机与Servlet的网络通信技巧
随着越来越多手提电话和个人数字助理开始融入到信息高速公路之上,从移动设备上访问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()
            {
            }
            //清除资源
            }
关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有