您的位置:首页 > 理论基础 > 计算机网络

使用J2me网络编程访问网页内容

2007-03-17 17:05 351 查看
使用J2me网络编程访问网页内容

编者案:
使用J2me网络编程访问网站页面,需要注意很多方面的内容,我只能将自己所知的一些注意事项及访问方法列出;
知识从微妙细小之处直到宏观伟大的道,在冥冥中千丝万缕的联系着,可是有谁能够把从原子如何相互作用直到人与人之间如何相处的道理联系在一起,掰开来,揉碎了,整理的清清楚楚,讲得明明白呢?小块的知识零落在各种不同的应用碎片上,而我能了解到的又更是那一小块知识中微不足道的一点皮毛,说得清,说不清,大伙将就着看吧。
前言:
网站的页面分为很多种类和形式,比如我所知道的html,asp/aspx,jsp,php,shtml,wml等;种类非常多,如果使用cgi或者isapi的方式,你还以关联自定义的文件扩展名作为网页页面的扩展名;但是我们可以简单的把获得网页的过程理解为当服务器收到客户端的请求后,向客户端返回一大堆的数据而已;因此,通信机制的模型很简单,而我们要关注的就是服务器与客户端双方是如何相互识别与互相通信的。这会涉汲到请求与响应的格式,请求与响应的内容是如何编码的?如果页面是位于移动梦网之内,又如果来获得页面?如果页面是freewap,又如何来获得?如果页是普通的web页面,那么又如何来获得?
(我们的论题比较简单,故先练一阵太级拳把读者绕晕,方可体现作者的思路清晰,嘿嘿)
正文:
一、请求与响应的格式
我们非常需要关注请求与响应格式的一至性,比如:客户端使用:
HttpConnection c = (HttpConnection)Connector.open(urlStr);
c.setRequestProperty("Content-Type", "application/xhtml+xml")
表明自己识别的是:application/xhtml+xml类型的格式,服务器在传输时请按照相应格式给我组织响应的byte[]流;
那么服务器最好按照客户端要求的格式来响应;
这叫配套,如果请求和响应不配套就会出现很多怪问题,比如丢字,乱码等;
至于配套的格式都有多少种,在网络上可以查到,我就不一一列举了,下面是一个关于Content-Type说明的地址:
http://cocp.blogdriver.com/cocp/1221254.html
这个地址不知道会开放多久,如果访问不到,就在Google上查 ”Content-Type” 即可

二、使用网关代理
如果我们只能通过中国移动的cmwap接入点访问网站页面(cmwap接入点也是移动梦网的网关)或者我们要访问位于移动梦网内的页面,那么我们就必须指定用于访问这些页面的代码网关:10.0.0.172:80
下面的例子表明了如何使用中国移动的代理网关;
例一:通过URL拆分的方法使用代理网关
Boolean UseAgent=true;
if (!UseAgent) {
c = (HttpConnection) Connector.open("http://" + “www.sina.com” + “/webui/index.html”, Connector.READ_WRITE, true);
} else {
c = (HttpConnection) Connector.open("http://10.0.0.172:80/"
+ “/webui/index.html”, Connector.READ, true);
c.setRequestProperty("X-Online-Host", “www.sina.com”);
}
之所以这样来写url,是为了方便大家看清楚在使用代理网关时如何进行url的拆分;

例二:不拆分URL,直接使用代理网关
Boolean UseAgent=true;
if (!UseAgent) {
c=(HttpConnection)Connector.open(urlStr);
} else {
c=(HttpConnection)Connector.open("http://10.0.0.172:80/"+urlStr);
c.setRequestProperty("X-Online-Host", urlStr);
c.setRequestProperty("Accept","*/*");
}
那两种方式有何区别?
例一的方式是标准的写法,但是用这种方法访问移动梦网内的网页会有问题:无法得到正确的网页;这时候就要用第二种方法了。第一种方法能做的事情,第二种方法似乎都能做到,至少我还没有遇见过反例。
至于这是为什么?我也不知道,知道的大仙如果感兴趣请回贴说明一下吧,小神在此先谢过。
关于cmnet与cmwap,读者可以在google上查”活猴工作室”,这哥们是CTO,他的blog上有一些非常不错的文章;
三、读取服务器响应的内容:
我们通常用以下几种方式读取服务器端响应的内容:
例一:按指定编码逐字符读取
int ch=0;
StringBuffer sb = new StringBuffer();
InputStreamReader isr = new InputStreamReader(dis,"utf-8");
try{
while ((ch=isr.read())!=-1){
System.out.print((char)ch);
sb.append((char)ch);
}
}catch(Exception ex){
sb.append("/r/n");
sb.append(ex.toString());
}
isr.close();
这种方法的优点是:它是在读取文本内容时最方便的一种作法,不过这种作法有一个缺陷,如果服务器端使用asp.net,用Response.write(“”)的方法向客户端返回的话,isr.read()永远读不到-1,.net和java在数值的字节流转换上划的不是一套拳。这时候就只能依靠使用最外层的那个try{}catch()来捕获错误的方法来终止读取,因此,这种方法看起来似乎总有点傻乎乎的感觉;
例二:先原样读取字节流,然后再对字节流进行转码;
ByteArrayOutputStream baout = new ByteArrayOutputStream(1024);
byte[] bytes = new byte[128];
int size = 0;
int TotalSize = 0;
requestByte = null;
while ((size = is.read(bytes)) != -1) {
baout.write(bytes, 0, size);
TotalSize += size;
}
bytes = null;
responseByte = baout.toByteArray();
String responseStr = new String(responseByte,"UTF-8");
注:responseStr即为所求;
这种方法忠实的读取出所有返回到客户端的字节流,并将这些字节流记录下来;
不过,要想这种方法读取到正确的字节流,我们需要留意在第一节中所提到的内容:“请求与响应的格式”
这种方法的好处是以不变应万变,万变不离其宗,管它服务器发来什么,不过都是一大堆的byte[]流而已,就像黑客帝国中的尼奥,他看破了这层byte[]流,想干嘛就干嘛。
四、编码
常用的汉字编码有:GB2313(GB2313-80)、GBK、UTF8、BIG5码,BIG5编码在港台用;
常用的其它编码有:ASC-II、ISO-8859-1、Unicode
为了获得网页的内容,当然要指定正确的编码了,不同的网页使用的编码会不同,所以使用相同的程序在访问不同的网页时会表现不同,这时千万别”大惊失色”,其实只是小问题;
说到这里,我要说个很苦恼的事情:我在google上很难查到各种国家标准,可能是这些链接很少被人关注到,一直希望能找到这样一个网站,上面有各种国家发布的标准、法律文件等可以被广大人民群众方便的查询到。不但齐全完整,而且还能与时具进,不知哪位大仙能告诉我几个这种网站的网址?小神在此先谢过!
下面这个网站是中国国家教育部网站下面收藏的GB2312-80字符集;用google翻出来的,如果想从教育部网站首页上找到它反而有点难度。另外,这个页面不知道能存放在那里多久。
http://www.moe.edu.cn/edoas/website18/info16417.htm


关于作者:
布老虎,QQ:67090182
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: