现在什么都要和网络有关系啊。
一些网络的问题,自己总结下。也是跟别人学的,感谢下亚日等同学。
首先,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,下次直接就可以使用,不需要再来判断。
总结
j2me网络问题汇总
最新推荐文章于 2024-08-25 12:26:45 发布