探索J2ME:用GCF通信

开发者在线 Builder.com.cn 更新时间:2002-11-18作者:BUILDER.COM 来源:

使用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);
     //必须设置内容类型t
     http.setRequestProperty("Content-Type",_
     "application/x-www-form-urlencoded");
     //为打开的连接打开输出流
     OutputStream ostream = http.openOutputStream()

然后,我循环访问ExpenseInfo数组,并把数组中的各个对象联为一个字符串,用OutputStream方法把字符串所保存的数据发送到服务器:

for (int i=0; i<expensesRecords.length; i++) {
     String s = ("ExpenseDate=" + expensesRecords[i].getDate().toString()+
     "&ExpenseCategory=" + expensesRecords[i].getCategory() +
     "&ExpenseAmount=" + String.valueOf(expensesRecords[i].getDollars()) +
     "." + String.valueOf(expensesRecords[i].getCents()) +
     "&ExpenseDescription=" + expensesRecords[i].getDescription());
     

在服务器端,你需要类似于CGI类型的处理过程(例如ASP、JSP或者Servlet)来接受数据。字符串中的每一对“标识符——数值”将按照递交表单的控制显示在接受页上,所以你的接受页访问这些数据的方式和访问表单数据相同。

尽管HTTP并不是传输大量数据的理想工具,它的灵活性还是足以用来完成本文中的工作,并且GCF使HTTP的用法特别简单。很幸运,GCF以后的版本将为开发者提供除HTTP外更多的选择。



责任编辑:炒饭

欢迎评论或投稿

用户评论

  • 用户名
  • 评论内容