j2me网络问题汇总

现在什么都要和网络有关系啊。
一些网络的问题,自己总结下。也是跟别人学的,感谢下亚日等同学。
首先,j2me在中国有2种通道CMWAP(及代理上网,主流,通过移动的网关10.0.0.172:80),CMNET(直接上网)。
再者,连接方式有HttpConnection和SocketConnection。
还有,所有的网络连接都是不安全的,可能会造成死锁或延迟,所以需要在一个新的线程中来实现。

先说说SocketConnection,学习了一段时间,基于连接的。
优点:一次连接,不会再提示用户连接,简洁,方便。
缺点:只能走CMNET,需要打开非80端口。
        并且不是所有手机都支持,会报SecurityException异常,可以忽略。
        传说中签名可以解决连接的提示问题,没试过!

主要还是说说HttpConnection。
优点:所有java手机都支持,同时也支持CMWAP,CMNET。
缺点:一次连接,想再连接必须要重新连接。会有提示,用户体验低。

1.建立HttpConnection
  需要考虑是否为代理并过滤代理页面。
 if (isProxy){//使用代理...
  hc = (HttpConnection) Connector.open("http://10.0.0.172:80"+filename);// 移动网关后要带上文件在服务器上的路径
  hc.setRequestProperty("X-Online-Host", uri);
  hc.setRequestMethod(HttpConnection.GET);//设置请求方法,如果不设置的话,则系统默认的请求就是GET请求
  hc.setRequestProperty("User-Agent", "Openwave"); //设置UA参数
  hc.setRequestProperty("connection", "close");
 // responseCode = hc.getResponseCode();
  String s=hc.getHeaderField("Content-Type");
  if(s.indexOf("text/vnd.wap.wml")>-1){//重新发起一次请求
   hc.close();
   hc = null;
   //System.gc();
   hc = (HttpConnection) Connector.open("http://10.0.0.172:80"+filename);// 移动网关后要带上文件在服务器上的路径
   hc.setRequestProperty("X-Online-Host", uri);
   hc.setRequestMethod(HttpConnection.GET);//设置请求方法,如果不设置的话,则系统默认的请求就是GET请求
   hc.setRequestProperty("User-Agent", "Openwave"); //设置UA参数
   hc.setRequestProperty("connection", "close");
   }
 }else{//不使用代理,在模拟器 可以获取出数据
  hc = (HttpConnection) Connector.open("http://"+uri+filename);
  hc.setRequestMethod(HttpConnection.GET);//设置请求方法,如果不设置的话,则系统默认的请求就是GET请求
  hc.setRequestProperty("User-Agent", "Openwave"); //设置UA参数
  hc.setRequestProperty("connection", "close");
  String s=hc.getHeaderField("Content-Type");
  if(s.indexOf("text/vnd.wap.wml")>-1){//重新发起一次请求
   hc.close();
   hc = null;
   hc = (HttpConnection) Connector.open ("http://"+uri+filename);
   hc.setRequestMethod(HttpConnection.GET);//设置请求方法,如果不设置的话,则系统默认的请求就是GET请求
   hc.setRequestProperty("User-Agent", "Openwave"); //设置UA参数
   hc.setRequestProperty("connection", "close");
  }
 }              


  同时考虑超时的情况。实现:通过一个记时器,来判断是否超时,超时则重新开始
 private class TimerClient extends TimerTask {
         public final void run() {
          TimerService.cancel();
          reStart();
          }
      }
 TimerClient timerClient = new TimerClient();
 TimerService.schedule(timerClient, 30000);//设置为30秒
 ---------------------
  TimerService.cancel();//关闭记时器
 
2.获取数据

 首先判断是否获取正确数据,并OK了。
 int responseCode = hc.getResponseCode();
 // 返回200OK时,从流中读取数据
 if(responseCode==200){
 in=hc.openInputStream();
 }
 获取数据
 PS:这里获取出来的数据经过UTF-8转码,同时你的数据源也必须是UTF-8,不然中文会乱码
 String temptext="";
        try{
         byte[] b = null;
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         byte[] b1 = new byte[1024];
         int i;
         while ((i = in.read(b1)) != -1) {
           baos.write(b1, 0, i);
           }
         b = baos.toByteArray();
         temptext=new String(b,"UTF-8");
         baos.close();
  }
         baos = null;
 }catch(Exception ee){
         System.out.println(ee);
        }


3.编程技巧
  可以将当前isProxy是否使用代理的变量放入RMS,下次直接就可以使用,不需要再来判断。

总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值