最近做开发的时候需要做一个javame,且需要与服务器端的javaee工程进行互动,在网上先找了一下,并没有很理想的demo,于是自己调研了一下javame的httpconnection后做了一个demo,包括了终端的代码以及服务器端的servlet。手机和Servlet通信比较简单的方法就是DataInputStream.readUTF和 DataOutputStream.writeUTF的配对使用,比如手机发送数据可以在Connection的输出流中用 DataOutputStream.writeUTF依次写入多个参数,相对应的,Servlet打开请求的输入流 (request.getInputStream)用DataInputStream.readUTF来依次读出。返回的参数也一样,Servlet用 response.getOutputStream打开输出流,并把返回值依次写入,手机端打开Connection的输出流并读出即可。至于多个参数多个返回值都是没有问题的,只是多次使用writeUTF和readUTF罢了。
首先是终端的开发,先看代码。
//包定义与类的导入 package com.blessdyb; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import javax.microedition.io.Connector; import javax.microedition.io.HttpConnection; import javax.microedition.lcdui.Command; import javax.microedition.lcdui.CommandListener; import javax.microedition.lcdui.Display; import javax.microedition.lcdui.Displayable; import javax.microedition.lcdui.Form; import javax.microedition.lcdui.TextField; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; //javame的midlet实现PostDemo类,包括一个输入用户名与密码及提交按钮的Form //及一个提交后显示服务器端信息的Form public class PostDemo extends MIDlet implements CommandListener{ //声明各种控件 private Display display; private Form formLogin=new Form("登陆"); private Form formInfo=new Form("信息"); private TextField tfusername=new TextField("用户名",null, 10,TextField.ANY); private TextField tfpassword=new TextField("密 码",null,10,TextField.PASSWORD); private Command cmdSubmit=new Command("登陆",Command.SCREEN,1); public PostDemo() { } protected void destroyApp(boolean bool) throws MIDletStateChangeException { } protected void pauseApp() { } //定义启动状态时的动作 protected void startApp() throws MIDletStateChangeException { display=Display.getDisplay(this); formLogin.append(tfusername); formLogin.append(tfpassword); formLogin.addCommand(cmdSubmit); formLogin.setCommandListener(this); display.setCurrent(formLogin); } //进行本地数据的获取及与远程服务器的连接,取值 private void postViaHttpConnection(String url) { try { HttpConnection hc=(HttpConnection) Connector.open(url); hc.setRequestMethod(HttpConnection.POST); DataOutputStream dos=hc.openDataOutputStream(); String username=tfusername.getString(); String password=tfpassword.getString(); dos.writeUTF(username); dos.writeUTF(password); dos.flush(); dos.close(); DataInputStream dis=hc.openDataInputStream(); String stringInfo=dis.readUTF(); formInfo.append(stringInfo); display.setCurrent(formInfo); dis.close(); } catch (IOException e) { e.printStackTrace(); } } public void commandAction(Command c, Displayable d) { if(c==cmdSubmit){ new Thread(){ public void run(){ postViaHttpConnection("http://localhost:8080/javame/postthings"); } }.start(); } } }下面是servlet应用的代码:
package com.blessdyb; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class PostServlets extends HttpServlet { private static final long serialVersionUID = 1L; public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //输入流定义及获取Post数据 InputStream is=request.getInputStream(); DataInputStream dis=new DataInputStream(is); String username=dis.readUTF(); String password=dis.readUTF(); dis.close(); //输出流定义及用户POST请求响应 DataOutputStream dos=new DataOutputStream(response.getOutputStream()); dos.writeUTF("您输入的信息为:\n用户名:"+username+"\n密码:"+password); dos.flush(); dos.close(); } }