首页 > 编程语言 >开发适应中国网络的J2ME连网程序

开发适应中国网络的J2ME连网程序

时间:2023-07-31 22:04:27浏览次数:57  
标签:http 请求 连网 程序 Connector HttpConnection HTTP J2ME 连接


开发适应中国网络的J2ME连网程序



随着中国移动,联通,电信的先后获得3G牌照,移动软件开发必定会热起来,无论是现在热火朝天的J2ME 版的UCWEB,QQ,还是移动的飞信等都是必须连网的,因此掌握J2ME的网络编程是我们程序员的一门绝技,而通用连接框架则是网络编程的基础。

这篇文章主要介绍

1. 通用连接框架的基础知识。

2. 中国环境下的网络开发

请注意本文假定读者熟悉 J2ME 环境中的 MIDlet 开发。需要在系统中安装 J2ME 开发环境才能编译代码示例,以及 J2ME Wireless Toolkit(WTK) 的安装指导,请参阅文章末尾参考资料 的小结。




GCF 是一组在 javax.microedition.io 包中定义的接口。图 1 显示了 GCF 的类层次结构。

通用连接框架介绍

开发适应中国网络的J2ME连网程序_数据

图 1. 通用连接框架的类层次结构

在 GCF 中共定义了七个接口 ,其中 Connection 是根。注意同时提供了对数据包(packet)和流连接的支持。正如您设想的那样,沿着层次结构向下就会发现提供更多功能的接口。例如, StreamConnection 支持输入和输出流, ContentConnection 扩展了 StreamConnection 以支持对流的内容类型、数据长度和编码格式的确定。

Connector 类用于在 GCF 中打开类型的连接。下面可以看到 Connector 类中的 open() 方法的格式:Connector.Open("protocol:address;parameters"); Open方法会根据你提供的字符串参数进行Connection的绑定。

GCF 在支持不同的连接协议方面特别灵活。在请求打开一个连接时, Connector 类使用其 Class.forName() 方法搜索实现了所请求的协议的类。如果找到这个类,就返回一个实现了 Connection 接口的对象。

下面是一些常用打开一个Connection的方法:




Connector.Open("socket://www.lexun.com:80"); //TCP套接字通讯连接建立
 Connector.Open("http://www.itpub.net");//通过Http协议数据通信
 Connector.Open("datagram://www.ucweb.com:1000");//数据报套接字通讯建立
 Connector.Open("file://makefile.txt");//访问手机文件
 Connection conn = Connector.open("comm:0; baudrate=5333");//基于串口协议的数据通信




连接框架的用法

七种创建连接的方法,下面是代码示例




public static Connection open(String name)
public static Connection open(String name)
public static Connection open(String name, int mode, boolean timeouts)
public static DataInputStream openDataInputStream(String name)
public static DataOutputStream openDataOutputStream(String name)
public static InputStream openInputStream(String name)
public static OutputStream openOutputStream(String name)




Connector 构建了7个静态的方法,上面方法,具体的相关用法以及参数说明可以查看APIs文档。
通讯连接的IO数据流过程基本步骤分别是建立连接、网络通讯、连接关闭。
1、建立连接,创建与服务端的连接初始化以及完成连接过程。
2、数据通讯,在连接已建立的基础上进行数据的交换以及完成通讯过程。
3、完成通讯之后即关闭网络通讯连接,释放资源。

使用小秘密:

在程序调用Connector.open()相关方法的时候,如果您的J2ME程序是没有经过签名的,系统会弹出一个是否允许的对话框,其实,我们在开发的过程中也可以调用下面的代码进行一些权限的判断,然后做出适当的动作。
MIDlet. checkPermission("javax.microedition.io.Connector.file.read");
MIDlet. checkPermission("javax.microedition.io.Connector.file.write");
MIDlet.checkPermission("javax.microedition.io.Connector.http")
其他一些权限检查请查看相关的APIs文档。

简单用法代码片段



// Create a ContentConnection
String url = "http://www.corej2me.com"
ContentConnection connection = (ContentConnection) Connector.open(url);
// With the connection, open a stream
 InputStream iStrm = connection.openInputStream();
// ContentConnection includes a length method
int length = (int) connection.getLength();
if (length != -1)
 {
byte imageData[] = new byte[length];
// Read the data into an array
iStrm.read(imageData);
 }



3 .1 中国的网络环境



3 .2 HttpConnection 介绍

我们先来讲解下HttpConnection相关的方法。

现在您已经看到 GCF 是如何支持不同类型的连接的,并且开发了我们的第一个连网 MIDlet,现在可以更深入地分析 MIDP 中对 HTTP 的支持。我们将首先从一个更新过的层次结构图开始,它表明了哪个类提供了对 HTTP 连接的支持。

开发适应中国网络的J2ME连网程序_数据

图:支持 HTTP 的 GCF 类

原来的 MIDP 1.0 规范只要求设备支持 HTTP 连接协议,而更新的 MIDP 2.0 规范要求同时支持 HTTP 和 HTTPS,后者提供了对更安全 style="COLOR: #000000" href="http://safe.it168.com/" target=_blank>安全的网络连接的支持。使用这些协议的 API 分别是 HttpConnection 和 HttpConnection 。除了这些强制性的协议,设备制造商可能会选择支持更多的通信协议,如数据包或者套接字。虽然有时会方便一些,但是您应当了解使用特定于厂商的协议会影响应用程序到其他设备的可移植性。

请求和响应协议:HTTP 和 HTTPS 都是请求/响应协议。客户机发送请求,而服务器 style="COLOR: #000000" href="http://server.it168.com/" target=_blank>服务器发送响应。在继续后面的内容之前,我们将分析客户请求和服务器响应的各个方面。

客户请求:客户请求(client request),有时称为请求实体,由以下三个部分组成:

· 请求方法

· 头

· 正文

我们将详细讨论这三个部分。

请求方法:请求方法(request method)确定数据如何发送给远程资源。可以使用的三种方法是 GET、 POST 和 HEADER 。使用 GET 时,数据是作为 URL 的一部分发送的。使用 POST 时,所有客户机数据都是在与建立连接的请求不同的、单独的流中发送的。 HEADER 请求不向服务器发送任何数据。相反, HEADER 请求只是描述(meta)关于远程资源的信息。

用 GET 打开一个 HTTP 连接

String url = "http://www.ucweb.com?size=large";
HttpConnection http = null;
http = (HttpConnection) Connector.open(url);
http.setRequestMethod(HttpConnection.GET);
setRequestProperty("User-Agent", "Openwave");
Openwave -- 是一个比较出名的Wap浏览器厂商,因此设置这个UA,移动网关一般可以通过。
用 POST 打开一个 HTTP 连接
String url = "http://www.ucweb.com",
tmp = "test data here";
OutputStream ostrm = null;
HttpConnection http = null;
http = (HttpConnection) Connector.open(url);
http.setRequestMethod(HttpConnection.POST);
// Send client body
ostrm = http.openOutputStream();
byte bytes[] = tmp.getBytes();
for(int i = 0; i < bytes.length; i++)
{
os.write(bytes[i]);
}
os.flush();

POST/GET 请求一般都是在网页中的Form进行指定,如果你乱用这些请求可能会导致一些意外的效果,比如Form指定POST请求,则用GET请求就会出问题。

上面的请求过程只是完成一次HTTP请求中的客户端请求,下面我们来看下服务器是怎么响应的。

服务器响应:当服务器收到并处理了客户请求后,它必须打包并发送响应。与客户请求一样,服务器响应有三个部分:

· 状态行

· 头

· 正文

状态行:顾名思义, 服务器状态行(server status line)通知客户机其请求的结果。HTTP 将状态行代码分为以下三大类:

· 1xx是提供信息 。

· 2xx是成功 。

· 3xx是重定向 。

· 4xx是客户机错误 。

· 5xx是服务器错误。

更加具体的响应代码请查看HTTP相关协议文档。

介绍一本书《Java Servlets 2.3 编程指南》此书状态代码有详细的介绍。

服务器状态行包括在服务器上运行的协议版本号、状态码和表示返回代码的文字消息。下面是有效的状态行的几个例子:

· “HTTP/1.1 200 OK”

· “HTTP/1.1 400 Bad Request”

· “HTTP/1.1 500 Internal Server Error”

头:与客户机不同,服务器可以通过头字段发送信息。

显示了三种最常用的、提取来自服务器的头信息的方法。

String getHeaderField(int n) Get header field value looking up by index

String getHeaderField(String name) Get header field value looking up by name

String getHeaderFieldKey(int n) Get header field key using index

注意:虽然系统给你提供了这些方法,但建议你通信的时候别这么做,因为有可能有些地方的移动网关会过滤掉你这些参数。至于该怎么传输你想要的数据,那就看各位的私有的协议是咋通讯了。

在开发网络软件,很多时候是需要调试的,因此一款好的抓包工具对我们的工作帮助是很大的,在这里我推荐使用iris http://www.eeye.com/html/Products/Iris/index.html


3 .3 创建GPRS连接

在中国目前知道的可以连接成功的有中国移动,跟中国联通,由于移动起步比较早,相对网关,以及基站方面的建设要好于联通,而且基于移动方面的软件也相对多而且成熟,因此联通在建设GPRS方面就向移动靠拢,原则上来说,联通是无缝兼容移动的,但是也不保证有细微的差别,读者在开发网络环境下的软件的时候,最后经过两个网络的验证才能保证产品的网络质量。至于电信,由于电信刚接手移动通信,因此在网络的建设,经验方面相对差点,因此到目前为止,我还没有找到一个办法连接ctwap。这里只介绍cmwap,uniwap连接的创建方式以及注意事项。

打开GPRS Http连接的代码清单

HttpConnection sHttp = (HttpConnection) .Connector.open("http://10.0.0.172:80");

sHttp.setRequestProperty("X-Online-Host","wap.ucweb.com");

代码就这么简单,不过这里需要注意的Header的发送。

User-Agent -- 非常重要的参数,很多网站对这个字段很敏感,如果这个字段发送有误,或者含糊不清,及有可能对方服务器会相应500,或者其他错误。

Connection -- 向对方服务器请求连接的模式,Close 请求一次就关闭,Keep-Alive 保持连接,原则上说来,keep-alive可以达到最优化的速度,但是也是需要客户端跟服务器同时支持才行。建议采用close模式,这样做就比较稳妥了。

还有其他一些参数,可以参考HTTP相关的协议说明。


标签:http,请求,连网,程序,Connector,HttpConnection,HTTP,J2ME,连接
From: https://blog.51cto.com/u_3124497/6913749

相关文章

  • android程序调用另一个android应用…
    android程序调用另一个android应用程序请求:例子:    newComponentName("com.gwsoft.player.activity","com.gwsoft.player.activity.PlayerActivity");newIntent();newBundle();"resUrl",resurl);......
  • WPF安装打包程序
    转载于:https://blog.csdn.net/Reborn214/article/details/127671649WPF程序打包1.在VisualStudio扩展中下载并安装MicrosoftVisualStudioInstallerProjects2022 2.以Release模式运行项目3.在解决方案中新建Setup项目 4.将项目工程Debug或者Release......
  • 杭州快盈施佳:基于支付宝小程序云的文旅数智新实践
    “我们做的转变是从人找服务变成服务找人,这里边涉及到了我们跟小程序云最大的一块合作,就是如何通过引擎的方式将碎片化的服务,在合适的地点将合适的服务通过合适的方式推送给合适的人。”在7月7日举办的支付宝小程序云产品发布会上,来自杭州快盈信息科技有限公司的副总裁施佳,为我们带......
  • 微商城小程序怎么开发?(微商城小程序开发流程)
    微商城小程序作为一个便捷的电商平台,成为越来越多企业和个人的选择。它不仅为商家提供了一个在线销售的渠道,也为消费者提供了更方便快捷的购物体验。那么,如何开发一个成功的微商城小程序呢?接下来广州名锐讯动将介绍微商城小程序的开发流程,并分享一些关键步骤和注意事项。第一步:需求......
  • 抽奖小程序开发如何提高用户参与度?
    抽奖活动作为一种具有互动性和娱乐性的营销方式,被越来越多的企业和个人采用。而随着移动互联网的发展,抽奖小程序的兴起为抽奖活动的展开提供了便利和创新。然而,如何提高用户参与度成为抽奖小程序开发中的关键问题。接下来广州名锐讯动将从设计策略、奖励机制和用户体验三个方面进行......
  • 关于自定义程序打包成jar包,并读取配置
    前言在实际开发过程中,我们有时候有把你编写的一段程序打成jar包的需求,而一些配置是需要去配置文件里面读取关于这项目的一些配置,本人在网络上查询了众多的资料,总的来说可以归为3类1.从数据库读取配置 老生常谈,在dao层从数据库获取配置信息,然后返回到Service层进行业务逻辑......
  • 每天工作4小时的程序员
    每天工作4小时的程序员每个人都熟悉这种作息规律:早上9点去上班,坐在电脑前面,编一天的程序,下午5点下班回家。如今,非常感谢蒂莫西·费里斯(TimothyFerriss)的《每周工作4小时》,我开始重新思考应该如何工作,如何让自己变成更有效率的程序员。最近,我把我的从周一到周五的作息规律......
  • 程序员推荐的最简单有效的科学健脑…
    1、勤练脑力可使记忆力增强,感兴趣的程序猿可以来试试勤练脑力可使记忆力增强,勤做有氧运动可使大脑灰质增加,勤于思考可使理智与情感有机互补。这些措施看上去很美,但美中不足的是,它们对大脑的训练都不够彻底,这也是越来越多此类研究的通病。记忆训练对大脑的好处当然比看真人秀什么......
  • 程序员学习能力提升三要素
    IT技术的发展日新月异,新技术层出不穷,具有良好的学习能力,能及时获取新知识、随时补充和丰富自己,已成为程序员职业发展的核心竞争力。本文中,作者结合多年的学习经验总结出了提高程序员学习能力的三个要点。众所周知,现在是一个知识爆炸的时代,知识更新非常快。据测算,一个大学毕业生......
  • iOS应用程序生命周期(前后台切换,…
    //开发app,我们要遵循apple公司的一些指导原则,原则如下:1、应用程序的状态状态如下:Notrunning 未运行 程序没启动Inactive     未激活    程序在前台运行,不过没有接收到事件。在没有事件处理情况下程序通常停留在这个状态Active      激活 ......