手机网络编程杂谈
爪哇米工作室
陈跃峰
出自:http://blog.csdn.net/mailbomb
随着手机编程的发展,现在的手机网络编程已经成为一种基本的手机软件开发技能,虽然相对于PC网络编程来说,手机网络编程比较简单,且绝大部分都是进行客户端网络编程,但是在实际使用中还是存在一系列的问题。
本人自认为进行手机网络编程已经有段时间了,在这里将自己的一些手机网络编程的经验和大家进行分享,不足之处请大家积极指正,一起提高。
下面的说明部分适用于各种手机开发技术,代码部分以J2ME技术为基础进行说明。
<!--[if !supportLists]-->1、 <!--[endif]-->网络编程架构
手机网络编程的基本架构是监听器(Listener)模式,其基本的结构包含3个部分:
<!--[if !supportLists]-->l <!--[endif]-->界面类(或逻辑类)
public DemoCanvas
extends Canvas implements HttpListener{
public void paint(Graphics g){
…..
}
/**监听器回调方法*/
public void doResponse(byte[] b){
}
}
<!--[if !supportLists]-->l <!--[endif]-->监听器接口
public interface
HttpListener{
public void doResponse(byte[] b);
}
<!--[if !supportLists]-->l <!--[endif]-->网络线程
public class
HttpThread extends Thread{
private String url = “127.0.0.1/test/1.jsp”;
private byte[] b;
private HttpListener listener;
public HttpThread(byte[]
b,HttpListener listener){
this.b = b;
this.listener = listener;
start();
}
public void run(){
//联网代码
//调用监听器方法处理反馈
listener.doResponse(b);
}
}
使用这种基本结构最大的优势就是将网络线程类独立处理,只负责数据传输,而发送的数据生成以及反馈的数据处理,都通过监听器传递出去。则联网时,只需要将对应的类实现监听器,则需要联网时书写的代码是:
new
HttpThread(b,this);
这样就通过HttpThread类实现网络连接,而将接收到的数据又通过this监听器交给当前界面类进行处理,这样就可以方便的进行数据处理了。
当然,也可以比照doResponse方法实现类似的doError方法进行错误处理了。
<!--[if !supportLists]-->2、 <!--[endif]-->接入点处理
无论你使用何种手机开发技术,进行网络编程时都不能回避接入点的处理。
A)下面我们先来看一下各个运营商的接入点:
a)中国移动(ChinaMobile)
1)CMNET:直接连接,适用于各种网络方式,如socket、http等
如http连接的连接代码为:
HttpConnection hc =
(HttpConnection)Connector.open(
“http://127.0.0.1/test/1.jsp”);
2)CMWAP:代理连接,仅适用于http方式,说白了就是一个http代理服务器。
代理服务器地址:10.0.0.172
端口:80
如http连接的连接代码为:
HttpConnection hc =
(HttpConnection)Connector.open(
“http://10.0.0.172:80/test/1.jsp”);
hc.setRequestProperty("X-Online-Host",
“127.0.0.1”);
注意:CMWAP无法使用模拟器或本机测试,必须通过手机真机测试。
b)中国联通(ChinaUnicom)
1)CUNET,同CMNET
2)CUWAP,同CMWAP
c)中国电信(ChinaTelecom)
1)CTNET,同CMNET
2)CTWAP
代理服务器地址:10.0.0.200
端口:80
我的困惑是为啥CTWAP还和CMWAP、CUWAP使用的代理服务器地址不一样,很郁闷!高人解释解释。
总之各个运营商划分接入点的初衷是想建立一个网中之网,希望能通过内容进行收费,类似移动梦网的东西,可惜都不太成功,还是希望能早日取消接入点吧。
B)接入点处理:
对于开发者来说,既然手机划分了接入点,而且不同用户默认的接入点不一样,智能机用户一般还可以选择接入点,所以在进行网络编程时就必须要处理了,下面谈一下处理的方式:
<!--[if !supportLists]-->a)
<!--[endif]-->用户设置
这种处理方式就是在软件中提供一个选项,让用户可以设置网络方式。一般默认是CMNET,如果用户连接不上,则可以在设置界面中设置为CMWAP方式。
<!--[if !supportLists]-->b)
<!--[endif]-->自动适应
这种处理方式是软件在启动时自动识别接入点,识别的原理就是连接一下,如果连接不上就认为不是这种,而换一种方式。例如默认采用CMNET方式连接,如果连接不上则认为是CMWAP。还有一种方式是在第一次启动网络连接时,同时使用CMWAP和CMNET两种方式联网,那个可以连上就认为是哪种。
<!--[if !supportLists]-->3、 <!--[endif]-->Http or Socket?
Http方式不支持长连接,好处是通用,且可以使用各种接入点。
Socket方式是支持长连接,但是只能使用CMNET之类的接入点。
所以我的建议是如果你的软件需要通用一点的话还是使用Http吧,慢点就慢点吧!
<!--[if !supportLists]-->4、 <!--[endif]-->计费页面处理
移动为了防止用户误操作而产生流量,在一些情况下在联网时会出现一个资费提示的wml界面,这个界面在软件联网时也会出现。
由于计费页面的数据格式和软件的数据格式不一致,所以在联网时必须处理计费页面,处理的方式就是如果发现是计费页面则抛弃掉重新连接一次。
而判断计费页面的方式一般是使用响应头数据content-type来进行判断,所以我的处理方式时,自己的服务器设定成一种特定的content-type,例如aaa,每次读取反馈中的content-type,如果不是aaa的话就是计费页面了,重新连接一次即可。例如代码:
String s =
hc.getHeaderField("content-Type");
if (s.equals("aaa"))) {
} else {
hc = (HttpConnection)
Connector.open("http://" + url);
……
}
<!--[if !supportLists]-->5、 <!--[endif]-->网络超时处理
网络连接自然会有超时,如果一直停留在等待页面则会出现卡死的情况,所以一般都需要进行网络超时的处理。
如果你使用的网络技术自身支持超时,那么就恭喜你,这些就可以交给系统去做了,你只需要设置一个超时时间即可了。如果不支持,自己处理起来也不难。
处理的方法是:
一般你的程序中都会有一个线程(如果实在没有则只能新创建一个了),当开始联网时,使用这个线程进行即时,如果时间达到超时时间,例如30秒,则“停止”联网线程。
但是一般联网线程都是无法停止的,所以我们可以采用一种变通的方式,就是如果超时则丢弃联网的数据反馈。示例代码为:
public class
HttpThread extends Thread{
public boolean isAbandon;
public void run(){
//联网代码
//调用监听器方法处理反馈
if(!isAbandon){
listener.doResponse(b);
}
}
}
这样,如果超时则只需要设置:
http.isAbandon =
true;
其中http是联网线程对象。
<!--[if !supportLists]-->6、 <!--[endif]-->联网中断处理
在联网等待界面中,一般会设置一个“取消”按钮,可以运行用户在联网时取消该连接,处理的方式和5、网络超时处理的原理一样,只是一般还会涉及到界面的切换等。
<!--[if !supportLists]-->7、 <!--[endif]-->XML?
很多人可以会遇到传输的数据以xml的格式进行传输,在当前的2G网络下还是不建议这么做,还是自己设计一套紧凑的数据格式,无论是在数据量还是传输速度上都要好一些。
由于本人水平有限,希望大家多拍砖啊!
爪哇米工作室 陈跃峰
分享到:
相关推荐
C++ 编程杂谈之一:编译器 在编程领域中,选择合适的编译器是非常重要的。编译器是把 C++ 代码生成为可执行文件的工具,而不是语言本身。VC(Visual C++)和 BCB(Borland C++ Builder)是两个常用的编译器。 在...
Socket网络编程是计算机网络通信的一种常见技术,尤其在C#编程环境下,它为开发者提供了创建网络应用程序的基础。本案例涵盖了服务端和客户端的实现,旨在帮助有编程基础且对网络编程感兴趣的用户理解并掌握Socket...
在编程世界中,程序设计是一项核心技能,涵盖了多种技术和方法。程序设计经验杂谈涉及到的不仅仅是语法...在"程序设计经验杂谈"的资料中,你将找到更多关于这些话题的深入探讨和实用建议,帮助你在编程旅程中不断成长。
### Java杂谈——一个计算机专业学生几年的编程经验汇总谈 #### 一、关于动态加载机制 在Java中,动态加载机制是实现高效资源管理的关键之一。它允许Java虚拟机(JVM)根据需要加载类,而不是一次性加载所有的类。...
ERP实施杂谈ERP实施杂谈
### JAVA杂谈:深入探索Java的核心机制与实践 #### 动态加载机制解析 Java的动态加载机制是其面向对象编程(OOP)理念的核心体现之一,它使得Java能够在运行时根据需要加载类,而非在程序启动之初加载所有类。这种...
本文将结合"程序设计经验杂谈"的主题,深入探讨相关知识点,帮助想要踏入或正在编程开发领域的人士积累宝贵的经验。 1. **基本概念理解**:首先,理解程序设计的基本概念至关重要。程序是按照特定规则编写的指令...
在本文中,作者分享了作为一名计算机专业学生的编程经验,主要关注Java语言。文章分为三个部分,分别讨论了Java的动态加载机制、查找class文件的原理以及JDK和JRE的区别。 1. 动态加载机制: Java的动态加载机制...
在Java编程中,动态加载机制是一个至关重要的特性,它使得程序在运行时能够根据需要加载类,而不是在启动时一次性加载所有类。动态加载减少了内存占用,提高了程序的效率。当我们使用`java -verbose *.class`命令...
本文档《为己杂谈学习精要.doc》主要探讨了个人修养、企业文化、管理理念以及如何在职业生涯中找到良好发展平台的主题。作者引用了老子的哲学思想,并结合《论语》中的教诲,阐述了一种既考虑个人利益又兼顾他人和...
标题和描述中的"杂谈,一些工具类的集合"可能指的是一个涵盖多种工具的资源包,旨在解决日常开发中的各种问题。 首先,我们来探讨一下工具类在编程中的作用。在编程中,工具类通常是一组静态方法的集合,这些方法...
### 高并发架构设计 #### 一、高并发架构的核心挑战及应对策略 高并发架构设计的核心在于如何处理大量的并发请求,确保系统的稳定性和高效性。面对数据量大、访问突增、流量大等问题,通常需要采取一系列的技术...
地产行业杂谈系列之十六:社区增值服务模式初探