扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
在本页阅读全文(共2页)
越重要。Java开创了消费设备中小型的储存容量的先河,它是用于开发手机、传呼机及其他微型设备应用程序
的理想语言。
在本文中,我们将学习如何从一个J2ME客户机上向服务器发送一条HTTP GET请求和一条HTTP POST请
求。虽然这只是一篇探讨性质的文章,但是我还是假定读者已经熟悉Java,J2ME,以及Java Midlets(MIDP应
用程序)的运作机制。我们将使用J2ME的MIDP简表,并利用SUN的J2ME的无线应用程序开发工具包编译、配
置和测试我们的应用程序。对于HTTP服务器,任何WWW地址都可以被访问,但是默认时我们将使用一个简单
的Java Servlet来返回我们的HTTP请求的细节。
如何使用J2ME客户机向Web服务器和类似的支持HTTP的服务器发送HTTP请求呢?答案就是使用可在
javax.microedition.io程序包中可找到的J2ME的网络类。本文就想具体阐述这个问题。
本文概述∶
使用J2ME设计无线网络应用程序
.发送一条超文本GET请求
.发送一条超文本POST请求
.使用J2ME进行无线网络编程
Java的网络编程能力是相当健壮的。Java 2标准版( J2SE)在java.io和java.net程序包中定义了100多个接口
程序,类和异常。通过这些库实现的功能是很强大的,但是这只适用于传统的计算机系统,这些计算机系统有
强大的CPU处理能力,快速的内存和持久的数据储存,但是这些在大多数的无线设备上是不现实的。因此,
J2ME定义了这些函数的子集,并提供了一套用于网络和文件访问的固定的程序包--- javax.microedition.io程序
包。由于可移动设备种类繁多,这个程序包仅仅定义了一套接口,而为每个可移动设备供应厂商留下了实际的
应用程序接口实现。这就在可移植性和设备特定特征的应用中找到了一个最佳的平衡点。
定义在javax.microedition.io类中的抽象网络和文件输入输出框架称为通用连接框架(Generic Connection
Framework,简称GCF)。GCF定义了一套有关抽象化的内容来描述不同的通信方法。最高级的抽象被称作连
接(Connection),还声明了六个接口(四个是直接的,两个是间接的)。这七个接口就构成了J2ME的CLDC
的一部分,CLDC是大多数的能使用Java的无线设备使用的配置。设计这个配置的目的就是为所有的CLDC设备
(手提电话,双向传呼机,低档的PDA等等)提供公用的网络和文件输入输出能力。虽然GCF的目的是公用网络
和文件输入输出框架,但是生产商并不要求实现GCF中声明的所有的接口。有的厂家可以决定只支持socket连
接,而其它的厂家可以选择只支持基于数据报的通信。为了促进跨越类似装置的可移植性,MIDP规范要求所有
的MIDP设备实现HttpConnection接口。HttpConnection不是GCF的一部分,但是它是从GCF的一个接口
ContentConnection衍生出来的。我们将使用HttpConnection接口构造我们样本应用程序。
发送一个HTTP GET请求
这一节将重点解释程序代码,在下一节中我们将只讲述被用来发送HTTP请求并检索由服务器返回的响应通
用连接框架接口和HttpConnection接口。创建MIDP用户界面的程序代码见附录。
我们先要定义一个方法来放用于发送HTTP GET请求的代码。因为这个方法中的有些操作有潜在的抛出
IOException的可能,所以我们将把这样的意外(exception)抛给调用方法。
public String sendHttpGet( String url ) throws IOException { |
第一步是使用Connector类打开一个到服务器的连接,这是GCF的关键。我们将把这个连接强制转换为需
要的类型,在本例中为HttpConnection类型。
hcon = ( HttpConnection ) Connector.open( url ); |
接下来,我们得到HttpConnection上的一个DataInputStream,允许我们一个字符一个字符的读取服务器
的响应数据。
dis = new DataInputStream( hcon.openInputStream() ); |
使用DataInputStream的read ()方法,服务器响应的每个字符都被集中起来放入StringBuffer对象。
int ch; |
最后,连接对象被净空以保存资源,而信息从这个方法中返回。
} finally {
|
如何发送一个HTTP POST请求
你可以想象,发送一个HTTP POST请求的处理过程其实与发送一个GET请求非常地类似。我们将修改一个
现有命令,添加少量的新的命令,并添加一个来自通用连接框架的附加的对象和一个附加的StringBuffer对象把
POST请求体重的内容发送到服务器中。剩下的命令将保持不变。
复制我们刚才创建的sendHttpGet()方法,把它粘贴进同一个类文件,改名为sendHttpPost()。 现在,我
们将修改这个新方法来发送一个HTTP POST请求到服务器。 在方法的顶部添加两个新的变量说明。 声明一个
类型为DataOutputStream的变量和另一个String类型的变量。 我们将使用DataOutputStream对象把存在于字
符串变量中的POST请求体发送到服务器中。
DataOutputStream dos = null; |
修改connector.open()命令包含另一个参数,指出连接将允许客户端可以通过连接在服务器上读和写。
hcon = ( HttpConnection ) Connector.open( url, Connector.READ_WRITE ); |
设置HttpConnection对象使用的请求方法为POST(默认的方法是GET)。
hcon.setRequestMethod( HttpConnection.POST ); |
得到一个用于现有的HTTP连接的DataOutputStream对象。
dos = hc.openDataOutputStream(); |
声明一个字节数组并通过检索一个来自requestBody字符串的字节数组初始化。 然后把DataOutputStream
的缓冲写入字节数组内。
byte[] byteRequest = requestBody.getBytes(); |
调用flush ()方法的意图是发送已经写入的数据到DataOutputStream的服务器的缓冲区中。 在某些电话
上,这个操作工作正常,在其他的电话上,它导致HTTP请求的Transfer - Encoding被设置为" chunked ",有一
些随机字符被放到请求本身的前面和后面。那又怎样处理这个问题呢?这个方法调用实际上是根本不需要的。
在接下来的一行中,服务器连接打开(通过openInputStream ()),将自动输入缓冲区。因此,你最好不要调
用缓冲区的flush()方法。这个方法其余的部分保持不变,除了DataOutputStream对象必须在finally{}语句块中关
闭。
} finally { |
这就是所有的程序代码!并请参见本文后附带的程序代码。
随着可以使用国际互联网络和支持网络的无线设备日益的增多普及,Java和J2ME的重要性也在不断的变
大。因为HTTP协议是当前仅有的,被所有的遵从MIDP规范的设备支持的网络协议,它也是用于开发无线网络
应用程序的最好的候选者。
在本文中,我们探究了无线网络编程的基本结构和几个核心问题,我们看了如何调用两个最常用的HTTP请
求方法:GET和POST。J2ME仍然在它的发展初期,并且无线设备也即将得到大面积的普及。所以,所有有志
投身于无线网络编程中的开发者们将得到大展拳脚的好机会。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者