自中国移动启动上网资费页面提醒后,导致了很多的J2ME联网出现了联不上服务器的问题。即在j2me程序中启动联网后,在有些地区,有些时候,移动网关会把我们的请求截下,返还一个资费提醒的页面给我们,这样我们的服务器将不会收到我们的请求,导致程序出现联网失败的错误。
因此我们在处理网络连接时要加入对移动资费页面的处理,我们可以在发送网络请求后,对返回的response进行http头的检测,如果我们检测到返回的content-type是text/vnd.wap.wml,我们可以扔掉这个response,重新发起一次请求就可以解决资费页面的问题,或者我们也可以提取出资费页面里面的请求地址,再次发送一次请求。
处理的代码如下:
httpConn = (HttpConnection) Connector.open (url, permissions, true);
String s=httpConn.getHeaderField("Content-Type");
if(s.equals("text/vnd.wap.wml")){
//重新发起一次请求
httpConn = (HttpConnection) Connector.open (url, permissions, true);
}
如果程序本来要返回的类型就是WAP页面,那我们可以对WAP页面的内容进行关键字解析来判断是自己服务器返回的页面还是移动返回的资费提醒页面再进行处理。
以CMWAP代理的方式连接网络,在J2ME中,连接的代码和直接连接有所不同,代码如下:
HttpConnection http = (HttpConnection)Connector.open(("http://10.0.0.172/"+url);
http.setRequestProperty("X-Online-Host",ServerName);
例如你需要访问的地址为:http://www.test.com/login/loginServlet则上面的代码就为:
HttpConnection http = (HttpConnection)Connector.open(("http://10.0.0.172/" + "login/loginServlet");
http.setRequestProperty("X-Online-Host","www.test.com");
在实际使用过程中,只需要使用实际需要访问的地址的域名或者IP来代替ServerName,例如示例中的“www.test.com”,使用后续的地 址类代替代码中的url,例如示例中的“login/loginServlet”,就可以实际的使用CMWAP代理来进行连接了。
然后 再进行处理
String s1 = httpConn.getHeaderField("Content-Type");
if(s1.equals("text/vnd.wap.wml; charset=UTF-8")){
//重新发起一次请求
httpConn = (HttpConnection)Connector.open("http://10.0.0.172/"+url);
httpConn.setRequestProperty("X-Online-Host", "gamewave.cn");
}
自中国移动启动上网资费页面提醒后,导致了很多的J2ME联网出现了联不上服务器的问题。即在j2me程序中启动联网后,在有些地区,有些时候,移动网关会把我们的请求截下,返还一个资费提醒的页面给我们,这样我们的服务器将不会收到我们的请求,导致程序出现联网失败的错误。
因此我们在处理网络连接时要加入对移动资费页面的处理,我们可以在发送网络请求后,对返回的response进行http头的检测,如果我们检测到返回的content-type是text/vnd.wap.wml,我们可以扔掉这个response,重新发起一次请求就可以解决资费页面的问题,或者我们也可以提取出资费页面里面的请求地址,再次发送一次请求。
处理的代码如下:
httpConn = (HttpConnection) Connector.open (url, permissions, true);
String s=httpConn.getHeaderField("Content-Type");
if(s.equals("text/vnd.wap.wml")){
//重新发起一次请求
httpConn = (HttpConnection) Connector.open (url, permissions, true);
}
如果程序本来要返回的类型就是WAP页面,那我们可以对WAP页面的内容进行关键字解析来判断是自己服务器返回的页面还是移动返回的资费提醒页面再进行处理。