动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > J2EE/J2ME教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ J2EE/J2ME教程 ]的信息

本月文章推荐
.jboss配置系列第二天.
.一个简单的FileConnection范例.
.测试MySQL驱动的安装.
.RMS从入门到精通系列连载之一.
.设计移动 Web 服务 在设计移动 W.
.JDO架构介绍.
.J2ME程序开发初学者快速入门的九.
.JBOSS4数据源配置大全.
.BlueTooth探索系列(四)--服务发现.
.KVM的类加载.
.Servlet中jdbc应用高级篇之四.
.使用SPRING AOP框架和EJB组件.
.Eclipse与插件(tomcatPlugin Lo.
.RMS概念解析与使用指南.
.Servlet容器工作原理(四).
.经典收藏:J2MEGame的开发笔记.
.J2EE系统优化的几点体会(二、循.
.J2ME程序优化方法二十条.
.开源组织发布J2EE网上书店示例应.
.Filter技术的应用.

J2ME联网中采用序列化机制

发表日期:2007-12-23 |


    在CLDC中并没有对序列化机制进行支持,但是这并不影响我们在J2ME联网或者RMS操作中使用这种有效的机制,本文将讲述如何采用序列化机制进行J2ME联网。  如果读者对TOMCAT的使用和Java IO还不熟悉那么请参考如下两篇文章,作为本文的准备。Java的基本数据类型与流,Tomcat入门指南。我们要编写一个用户注册的应用程序,用户填写自己的信息然后通过联网把数据发送到服务器,在Server端我们用Servlet来接收用户的数据。这样有一个好处就是当我们需要修改用户注册的选项的时候,比如添加一个选项,我们不需要修改程序的联网部分,只需要修改用户类的序列化和反序列化方法就可以了。下面看看我们的Account类,它是对用户的注册信息进行封装,并提供了两个重要的方法serialize()和deserialize()。
package com.j2medev.mingjava;

import java.io.*;

public class Account
{
    private String userName = "";
    private String email = "";
    private int age = 0;
    private boolean gender = false;

    public Account()
    {

    }

    public Account(String userName, String email, int age, boolean gender)
    {
        this.userName = userName;
        this.email = email;
        this.age = age;
        this.gender = gender;
    }

    public void serialize(DataOutputStream dos) throws IOException
    {
        dos.writeUTF(userName);
        dos.writeUTF(email);
        dos.writeInt(age);
        dos.writeBoolean(gender);
       
    }

    public static Account deserialize(DataInputStream dis) throws IOException
    {
        Account account = new Account();
        account.userName = dis.readUTF();
        account.email = dis.readUTF();
        account.age = dis.readInt();
        account.gender = dis.readBoolean();
      
        return account;
    }

    public String toString()
    {
        return "UserName = " + userName + " Email = " + email + " age = " + age
                + " gender = " + (gender ? "male" : "female");
    }
}
当我们进行联网操作的时候,只需要调用account.serialize(dos),例如
        private void connect(String url)

        {
            HttpConnection httpConn = null;
            DataOutputStream dos = null;
            InputStream is = null;
            try
            {
                System.out.println("connecting to server.....");
                httpConn = (HttpConnection) Connector.open(url);
                httpConn.setRequestMethod(HttpConnection.POST);
                dos = new DataOutputStream(httpConn.openOutputStream());
                System.out.println(account.toString());
                account.serialize(dos);
                dos.close();

            } catch (IOException e)
            {
                e.printStackTrace();
            }
        }
服务器端收到客户端传送过来的Stream后,处理起来更简单,调用Account.deserialize(dis)就可以得到account对象了。
    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException
    {
        int length = request.getContentLength();
        System.out.println(length);
        DataInputStream dis = new DataInputStream(request.getInputStream());
        Account myAccount = Account.deserialize(dis);
        System.out.println(myAccount.toString());
    }

    我们下面做个简单的MIDlet,目的是收集用户填写的注册信息然后发送给服务器。界面如下所示:
J2ME联网中采用序列化机制(图一)

 

 

 

 

 

 

代码如下所示:

package com.j2medev.mingjava;

import javax.microedition.lcdui.Choice;

import javax.microedition.lcdui.ChoiceGroup;
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;
import java.io.*;
import javax.microedition.io.*;


public class NetworkMIDlet extends MIDlet implements CommandListener
{

    private Display display;
    private Form mainForm;
    private TextField userName;
    private TextField email;
    private TextField age;
    private ChoiceGroup gender;
    private NetworkThread nt;

    public static final Command connectCommand = new Command("Connect",
            Command.ITEM, 2);
    public static final Command exitCommand = new Command("Exit", Command.EXIT,
            1);
    public static final String URL = "http://localhost:8088/net/myservlet";

    protected void startApp() throws MIDletStateChangeException
    {
   
        initMIDlet();       

    }
   
    private void initMIDlet()
    {
        display = Display.getDisplay(this);
        mainForm = new Form("个人信息");
        userName = new TextField("姓名",null,20,TextField.ANY);
        email = new TextField("电子信箱",null,25,TextField.EMAILADDR);
        age = new TextField("年龄",null,20,TextField.ANY);
        gender = new ChoiceGroup("性别",Choice.EXCLUSIVE);
        gender.append("男",null);
        gender.append("女",null);
        mainForm.append(userName);
        mainForm.append(email);
        mainForm.append(age);
        mainForm.append(gender);
        mainForm.addCommand(connectCommand);
        mainForm.addCommand(exitCommand);
        mainForm.setCommandListener(this);
        display.setCurrent(mainForm);

        nt = new NetworkThread(this);
        nt.start();
    }

    private void exitMIDlet()
    {
        try
        {
            destroyApp(false);
            notifyDestroyed();
        } catch (MIDletStateChangeException e)
        {
            e.printStackTrace();
        }
&nb


  sp;   }


    protected void pauseApp()
    {
            }


    protected void destroyApp(boolean arg0) throws MIDletStateChangeException
    {
            }


    public void commandAction(Command arg0, Displayable arg1)
    {
        if(arg0 == connectCommand)
        {
            String name = userName.getString();
            String mail = email.getString();
            int myAge = Integer.parseInt(age.getString());
            int i = gender.getSelectedIndex();
            boolean myGender = i==0?true:false;
            Account account = new Account(name,mail,myAge,myGender);
            nt.setAccount(account);
        //   System.out.println(account.toString());
            synchronized(this)
            {
                notify();
            }             
           
        }
        else if(arg0 == exitCommand)
        {
            exitMIDlet();

        }

    }

    class NetworkThread extends Thread
    {
        private NetworkMIDlet midlet;
        private boolean going = true;
        private Account account = null;

        public NetworkThread(NetworkMIDlet midlet)
        {
            this.midlet = midlet;
        }

        public synchronized void setAccount(Account account)
        {
            this.account = account;
        }

        public void run()
        {
            while (going)
            {
                synchronized (midlet)
                {
                    try
                    {
                        midlet.wait();
                    } catch (InterruptedException e)
                    {
                        e.printStackTrace();
                    }
                }
                connect(URL);

            }
        }

        private void connect(String url)
        {
            HttpConnection httpConn = null;
            DataOutputStream dos = null;

            InputStream is = null;
            try
            {
                System.out.println("connecting to server.....");
                httpConn = (HttpConnection) Connector.open(url);
                httpConn.setRequestMethod(HttpConnection.POST);
                dos = new DataOutputStream(httpConn.openOutputStream());
                System.out.println(account.toString());
                account.serialize(dos);
                dos.close();

            } catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }

}

    服务器端我们只是把从客户端发送过来的数据反序列化后打印到控制台。Servlet的代码如下所示:
import java.io.DataInputStream;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class MyServlet extends HttpServlet
{

    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException
    {
        doPost(request,response);
    }

    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException
    {
        int length = request.getContentLength();
        System.out.println(length);
        DataInputStream dis = new DataInputStream(request.getInputStream());
        Account myAccount = Account.deserialize(dis);
        System.out.println(myAccount.toString());

    }
}
一定要把Account类也放到Server端,这样才可以实现反序列化的。(注意client和server的package并不一定)。启动Tomcat服务器,当客户端向服务器发送数据后,我们就可以在服务器端看到了。
J2ME联网中采用序列化机制(图二)

(出处:http://www.knowsky.com)


上一篇:.NET vs J2EE——面对SOA的荒谬与误解 人气:1069
下一篇:J2ME可选包—PIM介绍 人气:2446
浏览全部J2EE/J2ME的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-12-2 OpenPNE中文 v2.12.5 for win 中
2008-12-2 晴天电影系统(带一键迅雷/自定义
2008-12-2 QQip138闪字程序
2008-12-2 SmartWeb企业智能建站系统 v1.0.2
2008-12-2 梦想不死个人主页 v2009
2008-12-2 开良ASP小偷程序生成器 v1.1
2008-12-2 toolxp.cnalexa世界排名查询 php
2008-12-2 腾讯留言板 v1.3
2008-12-2 OpenPNE中文 v2.12.5 for linux
2008-11-29 Tencent Traveler 4.4
2008-11-29 龙卷风网络收音机 v3.0.0.0
2008-11-29 Intel Chipset Software Install
2008-11-29 TweakVI 1.0 Build 1100
2008-11-29 Opera 9.62 Build 10469
2008-11-29 MPlayer WW编译版 SVN-r28044(20
2008-11-29 NetTools网络工具v1.0.0破解版
2008-11-29 3DGallery三维体验1.1破解版
2008-11-29 SecretBook保密本v1.0破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | OPEN参数生成器 | 弹出式窗口代码产生器 | 密码登录生成器 | 在线按钮生成器 | Meta标签生成器 | 多色彩特效字代码生成器 | 网页代码调试器 | 在线FTP登陆 | Flash取色器 | 配色代码对照表 | 配色辞典 | CSS生成器 | 广告代码 | 框架网页代码生成器 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | 在线调色板 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 元素周期表 | 健康查询 | 世界时间 | 万年历 | 二十四节气 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2009 www.knowsky.com All rights reserved | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成