[转载]探索J2ME:用GCF通信
只有你实现移动设备与非移动设备互相通信的功能后,你设计的移动设备应用程序才可以称的上是真正有用的。手持PC如Palm拥有同步功能,使得它们可以实现上述功能,但是其它设备,如Java嵌入式电话,该如何实现该功能呢?J2ME的MIDP在javax.microedition.io程序包中提供了一整套类,统称为通用连接构架(Generic Connection Framework ,GCF)。GCF使得与其它设备的可编程传输(programmatically transferring)数据变得非常容易。
与世界相连
GCF是建立在用连接类来管理通信的概念基础上的,每个类用来管理具体某种通信方法。抽象Connection(通信)类(实际上,它只有一个已定义的方法,所以它确实很抽象)是所有连接连接类的基类,它可以依次实现五个接口类中的一种来定义他们的功能。这种设计的意图就是使得GCF变得通用而且易于扩展,而且使得编程者用起来尽可能的简单。
MIDP 1.0唯一支持的连接类型就是HTTP了,HTTP协议用于Web页面服务。对HTTP协议的支持是在HttpConnection类中实现的,我将在本文集中阐述这个类。你也许觉得内容限制在HTTP上不太好,实际上并不是这样的。你的移动设备应用程序最终将可以和任意一种Web服务器通信,并且HttpConnection类会很好的把各种管理通信的行为抽象出来:你无需担心端口或者其它乱七八糟的东西。你只需要知道三种HTTP请求,并把它们作为你的应用程序的连接媒介。
HTTP简述
详尽、透彻的讨论HTTP结构将会超出了本文的范围,可以这么说HTTP客户端可以向服务器端发出三种不同的请求中的某一种:GET、POST或者HEAD。不同请求的意义各不相同:
- GET请求是用来请求数据的,如Web页面或者多媒体文件。你也可以通过URL用GET请求向服务器发送数据,不过用这种方式只可以发送少量的数据,很显然,嵌入到URL的数据是清晰易见的(plainly visible)。
- POST请求可以通过单独的数据流来向URL发送数据。提交Web表单(form)会使你的浏览器向服务器发送POST请求。然后,Web服务器把检索到数据发送给页面或者URL指定的CGI程序中。在POST请求中你可以发送比GET请求更多的数据,不过它并不是真正安全可靠的,至少你的数据不是清晰的(in plain sight)。
- 最后要说说HEAD请求,它用来在服务器上检索元数据(metadata)。服务器的回应并不包含实际请求的数据,包含的只是关于请求的信息。
当收到客户端发出的请求后,服务器发出回应。回应信息可分为信息头和正文两个部分,它们包含实际请求的数据。信息头包括用来表示请求是否成功的状态字。状态字200表示请求成功,状态字400或者400以上表示请求失败。
使用HttpConnection类
现在,我们完全基于HTTP来看看如何用HttpConnection类来请求远端的服务器并获取数据。你可以用静态Connector类打开HttpConnection,它会为你维护对象。打开连接后,你可以通过指定HttpConnection.GET、 HttpConnection.POST,、或者HttpConnection.HEAD来设置你希望使用的客户请求类型:
http = (HttpConnection) Connector.open(“http://builder.com.com”);http.setRequestMethod(HttpConnection.GET);
你指定的请求会自动发送到你在Connector.open中设定的URL。然后你可以通过HttpConnection类中的getResponseCode方法来检测请求是否成功
if (http.getResponseCode() == HttpConnection.HTTP_OK){
} else {}
实际上,一旦你建立连接,发送和接受数据就是很简单的一件事了,你只需用HttpConnection类的openInputStream和openOutputStream方法打开适当的流对象就可以了。
接收数据
让我们看一个具体的例子。在程序清单A中,我已经写好了用以建立一个名为CGFMidlet的MIDlet例子的代码,它演示了通过HttpConnection类,如何读取保存在Web服务器中的小文本文件内容的过程。在运行这个例子前,你有可能需要修改URL(http://你的Web服务器/你的文件名.txt)为合适的内容。
让我们看看getHTTPFile方法,它是用来处理文件检索的。你就会发现HttpConnection类为该文件发出GET请求。当检查回应状态字、确保没有问题后,我用InputStream方法读取文件的内容并把它显示在MIDlet的主表单中:
stream = http.openInputStream();byte data[] = new byte[(int) http.getLength()];stream.read(data);output.setString(new String(data));
发送数据
你也可以用GET请求来向服务器发送数据,但是这个方法有个缺点(只能向服务器发送少量数据),我在前面已经暗示了这一点。如果发送数据的量很大,你最好用POST请求。你可以在程序清单B中看到ServerConnetion类是如何做到这一点的。该程序清单是我在本系列文章中所用到的例子程序ExpensesApp(你可以在这儿下载源代码)可以把开销发送到服务器保存而写的代码。除了我现在用HttpConnection.POST做为请求类型以及设置一种特殊的信息头来帮助服务器处理请求中的数据外,其它的东西都大致一样:
http.setRequestMethod(HttpConnection.POST);http.setRequestProperty("Content-Type",_"application/x-www-form-urlencoded");OutputStream ostream = http.openOutputStream()
然后,我循环访问ExpenseInfo数组,并把数组中的各个对象联为一个字符串,用OutputStream方法把字符串所保存的数据发送到服务器:
for (int i=0; i
在服务器端,你需要类似于CGI类型的处理过程(例如ASP、JSP或者Servlet)来接受数据。字符串中的每一对“标识符——数值”将按照递交表单的控制显示在接受页上,所以你的接受页访问这些数据的方式和访问表单数据相同。
尽管HTTP并不是传输大量数据的理想工具,它的灵活性还是足以用来完成本文中的工作,并且GCF使HTTP的用法特别简单。很幸运,GCF以后的版本将为开发者提供除HTTP外更多的选择。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/374079/viewspace-131732/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/374079/viewspace-131732/
[转载]探索J2ME:用GCF通信相关推荐
- 【转载】进程间的通信之剪贴板方法实现源码
1 源码无私奉献 2 3 void CClipboardDlg::OnBnClickedButton1() 4 { 5 // TODO: 在此添加控件通知处理程序代码 6 //打开剪贴板 7 if(O ...
- [转载]用J2ME开发企业级无线应用
用J2ME开发企业级无线应用 系统需求 现场销售人员在与客户洽谈时,需要及时地了解客户和联系人的详细资料,管理相关的商业机会,清楚公司产品的报价.存货等信息,能够方便地进行查询(多条 件).创建.更新 ...
- NET多线程探索-线程同步和通信
NET中各种线程同步方法 在NET多线程开发中,有时候需要多个线程协调工作,完成这个步骤的过程称为"同步". 使用同步的主要原因: 1.多个线程访问同一个共享资源. 2.多线程写入 ...
- [转载+原创]J2ME开发工具使用感受
http://www.3geye.net/?3/viewspace-440 为什么我这篇文章是说[转载+原创] 因为这里面的内容包含了 http://www.blogjava.net/fastpace ...
- 转载:通信方式:串口通信
文章为转载,如 文章预览: 一. 前言 1.什么是通信? 2.同步通信和异步通信 3.电平信号和差分信号 4.串行接口和并行接口 二. 串口通信的基本概念 1.串口通信特点(异步.差分.串行通信) 2 ...
- 【转载】MFC实现串口通信编程nbsp;-nbsp;yu…
MFC实现串口通信编程 vc++.c#专题 2009-10-08 22:32 在Windows应用程序的开发中,我们常常需要面临与外围数据源设备通信的问题.计算机和单片机(如MCS-51)都具 ...
- Java Socket编程----通信是这样炼成的
转载自 Java Socket编程----通信是这样炼成的 Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socke ...
- [J2ME]RSSOwlMidlet(RSS无线阅读器)设计说明
郑昀@ultrapower 产品名称 产品版本 Keyword: RssReader RssFeed Channel j2me midp midlet kxml xmlpull RMS RssOwl ...
- 华为发布《智能世界2030》报告,多维探索未来十年趋势
2021年9月22日,华为携手产业伙伴举办了智能世界2030论坛.华为常务董事.ICT产品与解决方案总裁汪涛以"无界探索,翻开未来"为主题演讲,发布了<智能世界2030> ...
- Android 开发:通信篇-TCP客户端
这节教给大家用Android写一个TCP客户端程序 官方文档 Socket - Android SDK | Android Developers 页面 编写连接程序 1.获取控件 EditText e ...
最新文章
- 任天堂遭史上最严重黑客攻击:完整源代码、设计文档及技术演示泄露
- C#DataGrdviewl加入checkBox全选删除
- 全面分析 Spring 的编程式事务管理及声明式事务管理--转
- 配置Bean的作用域对象
- 福利 | 全网疯传免费领,一整套算法课程,拿走不谢!
- iOS 判断设备型号
- 华为云严选上新啦!高效准确的数据同步方案来了
- Android 驱动(8)---简单实例讲解linux的module模块编译步骤
- 计算机专业毕设外文翻译springboot_java毕业设计_springboot框架的计算机系党员信息管理系统...
- CentOS7下让Asp.Net Core的网站自动运行
- 3月22 坐标系转换,旋转矩阵,仿射变换,例子,相机与世界,欧拉角与轴角公式,一个坐标系下面的轨迹
- synchronized锁和lock锁 队列中线程执行顺序对比
- RS485电路设计原理图
- Java 应用SAXReader 解析网络地址 XML
- Ubuntu 11.04 (Natty Narwhal)图形安装教程、基本设置
- c语言中数的表示 叙述正确,关于C语言中数的表示,以下叙述正确的是(
- 关于Scanner一些用法
- 四步完成离线部署wvs
- 视频剪辑方法,在视频上添加图片或者视频
- CentOS 中安装使用 xmms 音乐播放器
热门文章
- vaspkit使用_Vaspkit做电荷密度差图
- python求和函数详解_python求和函数sum()详解
- matplotlib报错:Glyph 25151 (\N{CJK UNIFIED IDEOGRAPH-623F}) missing from current font. func(*args)
- [MCM] MTSP问题的GA求解 多目标优化 (单起点 与 多起点)
- 阿里云轻量级应用服务器设置外网访问端口
- java实验室管理系统报告_基于JAVA的实验室信息管理系统设计与实现
- 用html制作四行四列的表格,HTML表格元素
- 世界排名在20多位的无名小站
- 报错:信息:INFO: Error parsing HTTP request header
- mysql 数据库恢复模式_数据库的恢复模式