`
redduke1202
  • 浏览: 25256 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

移动资费提示过滤

阅读更多
最近移动对网关进行改造,会弹出一个资费提示的wap页面,干扰了众多手机应用,手机网络游戏的正常运行,仅提供一个移动资费提示过滤的工具类代码,以抛砖引玉

package redduke.game.j2me.io;

import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.Hashtable;

import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;

public class HttpUtil{
	/*
	 * 缺省过滤器实例
	 */
	protected static HttpConnectionFilter filter=new HttpConnectionFilter()
	{
		public boolean accept(HttpConnection con) {
			/* 资费提示wap页面长度=438+目的地URL字符串字节长度 */
			return con!=null && con.getLength()!=438+con.getURL().getBytes().length;
		}
	};
	/**
	 * 打开一个HttpConnection
	 * @param url
	 */
	public static HttpConnection open(final String url)
	{
		/* 一个HttpConnection的代理实现 */
		return new HttpConnection()
		{
			/*
			 * 连接
			 */
			private javax.microedition.io.HttpConnection con;
						
			/*
			 * 连接次数,超过次数则认为连接失败
			 */
			private int connectCount=0;
			/*
			 * 输出缓冲
			 */
			private ByteArrayOutputStream baos=new ByteArrayOutputStream(1024);
			
			/*
			 * 请求属性
			 */
			private Hashtable requestProperties=new Hashtable();
			
			/*
			 * 请求方式
			 */
			private String method=GET;
						
			/*
			 * 连接服务器
			 */
			private void connect()
			{
				try
				{
					if(this.con!=null)
						this.con.close();
				}
				catch(Exception ex){}
				try
				{
					this.con=(javax.microedition.io.HttpConnection)Connector.open(url);
					this.con.setRequestMethod(this.method);
					Enumeration propertyKeys=this.requestProperties.keys();
					while(propertyKeys.hasMoreElements())
					{
						String propertyKey=(String)propertyKeys.nextElement();
						String propertyValue=(String)requestProperties.get(propertyKey);
						this.con.setRequestProperty(propertyKey,propertyValue);
					}
				}
				catch(Exception ex)
				{
					this.con=null;
				}
			}	
			/*
			 * 确认连接
			 */
			private void ensureConnect()
			{
				while(this.con==null || filter!=null && !filter.accept(this.con))
				{
					if(connectCount>=5)
						throw new RuntimeException("Connection failed");
					connectCount++;
					this.connect();
				}
			}
			
			public long getDate() throws IOException {
				ensureConnect();
				return this.con.getDate();
			}

			public long getExpiration() throws IOException {
				ensureConnect();
				return this.con.getExpiration();		
			}

			public String getFile() {
				ensureConnect();
				return this.con.getFile();		
			}

			public String getHeaderField(String arg0) throws IOException {
				ensureConnect();
				return this.con.getHeaderField(arg0);
			}

			public String getHeaderField(int arg0) throws IOException {
				ensureConnect();
				return this.con.getHeaderField(arg0);
			}

			public long getHeaderFieldDate(String arg0, long arg1) throws IOException {
				ensureConnect();
				return this.con.getHeaderFieldDate(arg0, arg1);
			}

			public int getHeaderFieldInt(String arg0, int arg1) throws IOException {
				ensureConnect();
				return this.con.getHeaderFieldInt(arg0, arg1);
			}

			public String getHeaderFieldKey(int arg0) throws IOException {
				ensureConnect();
				return this.con.getHeaderFieldKey(arg0);
			}

			public String getHost() {
				ensureConnect();
				return this.con.getHost();
			}

			public long getLastModified() throws IOException {
				ensureConnect();
				return this.con.getLastModified();
			}

			public int getPort() {
				ensureConnect();
				return this.con.getPort();
			}

			public String getProtocol() {
				ensureConnect();
				return this.con.getProtocol();
			}

			public String getQuery() {
				ensureConnect();
				return this.con.getQuery();
			}

			public String getRef() {
				ensureConnect();
				return this.con.getRef();
			}

			public String getRequestMethod() {
				ensureConnect();
				return this.con.getRequestMethod();		
			}

			public String getRequestProperty(String arg0) {
				ensureConnect();
				return this.con.getRequestProperty(arg0);
			}

			public int getResponseCode() throws IOException {
				ensureConnect();
				return this.con.getResponseCode();
			}

			public String getResponseMessage() throws IOException {
				ensureConnect();
				return this.con.getResponseMessage();
			}

			public String getURL() {
				ensureConnect();
				return this.con.getURL();
			}	
			public void setRequestMethod(String arg0) throws IOException {
				this.method=arg0;
			}
			
			public void setRequestProperty(String arg0, String arg1) throws IOException {
				requestProperties.put(arg0, arg1);
			}

			public String getEncoding() {
				ensureConnect();
				return this.con.getEncoding();
			}

			public long getLength() {
				ensureConnect();
				return this.con.getLength();
			}

			public String getType() {
				ensureConnect();
				return this.con.getType();
			}

			public DataInputStream openDataInputStream() throws IOException {
				ensureConnect();
				return this.con.openDataInputStream();
			}

			public InputStream openInputStream() throws IOException {
				ensureConnect();
				return this.con.openInputStream();
			}
			public void close() throws IOException {
				ensureConnect();
				this.con.close();
			}	
			public DataOutputStream openDataOutputStream() throws IOException {
				return new DataOutputStream(baos);
			}	
			public OutputStream openOutputStream() throws IOException {
				return baos;
			}
		};
	}
	/*
	 * 设置过滤器,可设置自定义过滤器
	 */
	public static void setHttpConnectionFilter(HttpConnectionFilter filter)
	{
		HttpUtil.filter=filter;
	}
	
	/**
	 * 过滤器接口
	 */
	public static interface HttpConnectionFilter
	{
		boolean accept(HttpConnection con);
	}
}



使用例子

HttpConnection con=HttpUtil.open("http:\\abc.com");
分享到:
评论
8 楼 zyhighway 2007-08-25  
其实简单的过滤方法是:在网络传送回来的数据流中,判断是否有你访问的网络地址数据串,如果有,就是资费页面,这时候再重新访问一次即可获得正确的数据。我的程序中就是这么做的,应该比较通用吧!
7 楼 lu_pp 2007-08-22  
好像每个地方的大小不一样啊
6 楼 ywg_2008 2007-05-25  
请问,你这个HttpConnection con=HttpUtil.open("http:\\abc.com");   放在哪儿,是不是我的过滤器就执行这段代码?谢谢
5 楼 nomen 2007-05-22  
protected static HttpConnectionFilter filter=new HttpConnectionFilter()   
    {   
        public boolean accept(HttpConnection con) {   
            /* 资费提示wap页面长度=438+目的地URL字符串字节长度 */  
            return con!=null && con.getLength()!=438+con.getURL().getBytes().length;   
        }   
    };
4 楼 redduke1202 2007-05-22  
在上海
3 楼 cuilichen 2007-05-21  
楼主在哪个省啊?不是全国的状况都是这样的吧?
2 楼 redduke1202 2007-05-21  
ps:缺省的过滤器中的关键数值438是经过测试得来的,这个过滤器实现比较简单,而且不需要读取内容下来进行判断,降低了信息流量,可根据具体应用自行实现HttpConnectionFilter接口,并设置
1 楼 ystt8283 2007-05-18  
感谢楼主的贡献,有机会想和楼主交流一下QQ361607124

相关推荐

    论文研究-基于顾客选择行为的移动资费套餐优化模型.pdf

    论文研究-基于顾客选择行为的移动资费套餐优化模型.pdf, 移动资费套餐是电信企业通过移动资费产品的多样化来满足市场中不同顾客需求的一种有效手段.在移动资费套餐的...

    移动资费开发需求文档

    ### 移动资费开发需求文档知识点解析 #### 一、移动用户资费统计系统 ##### 1.1 概述 本系统旨在通过模拟移动运营商的资费统计逻辑,来帮助理解不同用户类型的计费规则及其优惠套餐的管理。 ##### 1.2 用户类型 -...

    移动资费计划项目方法论介绍.ppt

    移动资费计划项目方法论是电信运营商制定和优化服务价格策略的重要指导,它涉及市场调查、数据分析和决策制定等多个环节。以下是对该方法论的详细阐述: 首先,市场调查是项目启动的基础,主要包括定性和定量两种...

    移动用户资费统计系统

    移动用户资费统计系统是一个设计用于模拟移动运营商对用户资费计算的应用。在这个系统中,主要涉及两类用户:普通用户和VIP用户,每类用户有不同的资费标准和优惠套餐。 对于普通用户,基础资费是无月租费用,通话...

    中移动三大套餐资费管理培训专题(PDF 74页).pdf

    根据提供的文件内容,以下是对中移动三大套餐资费管理培训专题知识点的详细说明: 1. 市场环境变化 文档提到2009年前5个月的行业收入同比增幅为2.1%,为近年最低,说明行业增长速度放缓。同时,上半年国家公布经济...

    【移动互联网应用资费的可承受性】移动互联网套餐一览表.docx

    ### 移动互联网应用资费的可承受性分析 #### 一、移动互联网概述与重要性 移动互联网作为信息技术领域的重要突破,通过移动终端(如手机、笔记本电脑等)利用移动网络提供通信与互联网服务。它不仅扩展了虚拟与...

    20210422-中国信通院-通信行业:中国宽带资费水平报告(2020年第四季度).pdf

    这份《中国宽带资费水平报告(2020年第四季度)》详细记录了中国固定宽带和移动通信业务的资费情况,并将中国的情况与世界上其他国家和地区进行了对比。报告由权威机构中国信息通信研究院发布,目的是为了全面掌握...

    中国联通3G移动业务资费体系和标准培训.ppt

    中国联通的3G移动业务资费体系是针对2009年4月推出的一套全国统一的计费标准,旨在提供多样化的服务选择和清晰的计费模式。这套体系包括3G语音业务、3G增值业务、3G国际业务以及相关的业务规范。 1. **3G语音业务...

    中国移动BOSS系统资费管理概述.pptx

    中国移动BOSS系统资费管理概述.pptx

    电信资费管理系统

    《电信资费管理系统:Java实现基础解析》 电信资费管理系统是信息技术在电信行业的实际应用,主要用于管理和控制电信服务的费用结构、计费规则以及账单生成等关键环节。在这个项目实训中,我们关注的是一个基于Java...

    电信项目 资费管理文档

    在util包中,可以存放通用工具类,而在filter包中,设置过滤器来处理如字符编码等全局性问题。 在实际开发过程中,完成JSP页面的修改以展示和操作资费信息,如listPricing.jsp用于列表展示,pricingmes.jsp用于查看...

    资费通(安卓手机资费套餐统计)

    安卓手机应用资费通,了解手机剩余资费状况。

    山东农业大学手机资费系统

    【山东农业大学手机资费系统】是一个为学生提供实践学习的项目,主要目的是让学生在学习C++之后能够将理论知识应用于实际。此系统采用Java和C++两种编程语言进行开发,展示了这两种语言在实现类似功能时的不同方法和...

    中国移动技术部GPRS基础

    中国移动技术部的GPRS(General Packet Radio Service)基础讲稿主要涵盖了GPRS这一移动数据通信技术的核心概念、工作原理以及在中国移动网络中的应用。GPRS是2G网络向2.5G网络演进的关键技术,为用户提供了一种在...

Global site tag (gtag.js) - Google Analytics