手机网络编程杂谈

原创 2010年11月22日 17:08:00

手机网络编程杂谈

爪哇米工作室 陈跃峰

出自:http://blog.csdn.net/mailbomb

 

         随着手机编程的发展,现在的手机网络编程已经成为一种基本的手机软件开发技能,虽然相对于PC网络编程来说,手机网络编程比较简单,且绝大部分都是进行客户端网络编程,但是在实际使用中还是存在一系列的问题。

         本人自认为进行手机网络编程已经有段时间了,在这里将自己的一些手机网络编程的经验和大家进行分享,不足之处请大家积极指正,一起提高。

         下面的说明部分适用于各种手机开发技术,代码部分以J2ME技术为基础进行说明。

1、  网络编程架构

手机网络编程的基本架构是监听器(Listener)模式,其基本的结构包含3个部分:

l  界面类(或逻辑类)

public DemoCanvas extends Canvas implements HttpListener{

           public void paint(Graphics g){

                    …..

     }

 

           /**监听器回调方法*/

           public void doResponse(byte[] b){

 

           }

}

l  监听器接口

public interface HttpListener{

           public void doResponse(byte[] b);

}

l  网络线程

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方法进行错误处理了。

2、  接入点处理

无论你使用何种手机开发技术,进行网络编程时都不能回避接入点的处理。

A)下面我们先来看一下各个运营商的接入点:

a)中国移动(ChinaMobile)

1)CMNET:直接连接,适用于各种网络方式,如sockethttp

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还和CMWAPCUWAP使用的代理服务器地址不一样,很郁闷!高人解释解释。

总之各个运营商划分接入点的初衷是想建立一个网中之网,希望能通过内容进行收费,类似移动梦网的东西,可惜都不太成功,还是希望能早日取消接入点吧。

                   B)接入点处理:

对于开发者来说,既然手机划分了接入点,而且不同用户默认的接入点不一样,智能机用户一般还可以选择接入点,所以在进行网络编程时就必须要处理了,下面谈一下处理的方式:

a)       用户设置

这种处理方式就是在软件中提供一个选项,让用户可以设置网络方式。一般默认是CMNET,如果用户连接不上,则可以在设置界面中设置为CMWAP方式。

b)       自动适应

这种处理方式是软件在启动时自动识别接入点,识别的原理就是连接一下,如果连接不上就认为不是这种,而换一种方式。例如默认采用CMNET方式连接,如果连接不上则认为是CMWAP。还有一种方式是在第一次启动网络连接时,同时使用CMWAPCMNET两种方式联网,那个可以连上就认为是哪种。

3、  Http or Socket?

Http方式不支持长连接,好处是通用,且可以使用各种接入点。

Socket方式是支持长连接,但是只能使用CMNET之类的接入点。

所以我的建议是如果你的软件需要通用一点的话还是使用Http吧,慢点就慢点吧!

4、  计费页面处理

移动为了防止用户误操作而产生流量,在一些情况下在联网时会出现一个资费提示的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);

                ……

     }

5、  网络超时处理

网络连接自然会有超时,如果一直停留在等待页面则会出现卡死的情况,所以一般都需要进行网络超时的处理。

如果你使用的网络技术自身支持超时,那么就恭喜你,这些就可以交给系统去做了,你只需要设置一个超时时间即可了。如果不支持,自己处理起来也不难。

处理的方法是:

一般你的程序中都会有一个线程(如果实在没有则只能新创建一个了),当开始联网时,使用这个线程进行即时,如果时间达到超时时间,例如30秒,则“停止”联网线程。

但是一般联网线程都是无法停止的,所以我们可以采用一种变通的方式,就是如果超时则丢弃联网的数据反馈。示例代码为:

public class HttpThread extends Thread{

           public boolean isAbandon;

public void run(){

         //联网代码

         //调用监听器方法处理反馈

         if(!isAbandon){

                  listener.doResponse(b);

}

}

}

这样,如果超时则只需要设置:

           http.isAbandon = true;

其中http是联网线程对象。

6、  联网中断处理

在联网等待界面中,一般会设置一个“取消”按钮,可以运行用户在联网时取消该连接,处理的方式和5、网络超时处理的原理一样,只是一般还会涉及到界面的切换等。

7、  XML?

很多人可以会遇到传输的数据以xml的格式进行传输,在当前的2G网络下还是不建议这么做,还是自己设计一套紧凑的数据格式,无论是在数据量还是传输速度上都要好一些。

 

 

由于本人水平有限,希望大家多拍砖啊!

爪哇米工作室 陈跃峰

手机网络编程杂谈

手机网络编程杂谈爪哇米工作室 陈跃峰出自:http://blog.csdn.net/mailbomb          随着手机编程的发展,现在的手机网络编程已经成为一种基本的手机软件开发技能,虽然相...
  • zz898626
  • zz898626
  • 2010年11月24日 19:43
  • 123

四月杂谈

四月杂谈
  • gjj920318
  • gjj920318
  • 2016年04月01日 16:06
  • 1911

开个公众号 大数据务虚杂谈 ;)

开个公众号: 大数据务虚杂谈
  • colorant
  • colorant
  • 2017年06月02日 22:44
  • 513

在CTeX上编码论文《杂谈勾股定理》及论文式样

在CTeX上实现论文《杂谈勾股定理》编码如下: %-*- coding: UTF-8 -*- %gougu.tex %勾股定理 \documentclass[UTF8]{ctexart} \ne...
  • gongxifacai_believe
  • gongxifacai_believe
  • 2016年06月29日 22:12
  • 1078

杂谈Javascript

setTimeout与setInterval区别他们的作用都可以将某个操作延迟多少加入UI队列,setTimeout只加入一次,而setInterval会重复添加,操作的执行会在加入队列之后,在他之前...
  • mzzzzq
  • mzzzzq
  • 2016年09月11日 23:49
  • 194

量化杂谈

转载 【量化杂谈之基础篇1】获取所有股票的代码和名字——一个爬虫的简单例子 http://bbs.pinggu.org/thread-4145710-1-1.html 【量化杂谈之基础篇2】回测的那些...
  • xf_87
  • xf_87
  • 2017年04月15日 14:35
  • 198

下载CRFPP杂谈

按照官方下载来,一般下载python源码,都是四个步骤: 1   解压压缩包 2   ./configure 3  make 4  sudo make install 但是在make instal...
  • gdufsTFknight
  • gdufsTFknight
  • 2018年01月11日 09:58
  • 110

MMORPG开发杂谈(二):消息处理框架

 一个网络游戏要处理的消息是很多的,如果规划不好,程序就会越写越乱。消息主要有两种:网络消息和本地逻辑事件,对于服务器和客户端都是这样。服务器需要接收客户端发过来的消息,进行运算,然后处理各个客户端之...
  • yanonsoftware
  • yanonsoftware
  • 2006年07月19日 11:48
  • 2984

写在前面:挖一个大坑

(本博客所有文章也会更新在知乎专栏物竞杂谈 ,因为看起来知乎对手机用户更友好一些)     As we all know,中学生物理竞赛这几年的颓势日益明显,目前进行了一半的34届选拔能力更是惊人地...
  • ZaoHan
  • ZaoHan
  • 2017年09月25日 13:15
  • 260

[经济杂谈]十八大后的中国经济

http://bbs.tianya.cn/post-develop-1197354-1.shtml   一、目前中国经济所处的位置   要谈论中国经济,必须要认清目前中国经济目前所处的位置,...
  • zhoubl668
  • zhoubl668
  • 2013年01月19日 21:44
  • 1818
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:手机网络编程杂谈
举报原因:
原因补充:

(最多只允许输入30个字)