一种基于散列表的双向机顶盒会话信息维护方法
技术领域
本发明涉及数字电视通信技术领域,尤其涉及在数字电视双向IP机顶盒与应用服务器AS之间一种基于散列表的会话信息维护方法。
背景技术
随着数字电视双向IP机顶盒的出现,节目点播、信息查询与浏览等各种丰富的业务也可通过数字电视的渠道展现给用户,由于互动频道和用户数量的增多,双向机顶盒与应用服务器AS之间交互的重要性日益凸显。目前,许多数字电视机顶盒与后台之间仍然采用面向无连接和无会话状态的方式进行通信,这样的通信方式只适应传统的广播式数字电视网络,不足以胜任双向互动的任务。一部分基于HTTP协议的双向IP机顶盒业务提供商采用了HTTP协议的内建对象session进行会话状态的保存,这种方法虽然可以满足互动较为简单的机顶盒应用,然而对于集视频点播、数字医疗、刷卡支付、三表查询等多种复杂业务于一体的双向机顶盒应用来说,各个频道业务共享一个内建对象session,势必造成系统的高耦合,导致系统安全性与灵活性上的不足。一旦互动系统的结构较为复杂,采用HTTP协议内建对象session进行会话维护可能引发意想不到的错误。
发明内容
针对现存技术的不足,本发明的目的是提供一种基于散列表的双向机顶盒会话信息维护方法。利用散列表结构存取速度快的特点,在常数级的时间内完成会话信息的维护,减少用户访问互动频道带来的系统开销。同时,避免不同频道之间共享session对象造成的安全问题,使得频道会话信息与频道处理流程得以结合,进而满足各个数字电视应用频道之间低耦合、高内聚的要求,以提高数字电视系统的效率与安全性。
为达到以上目的,本发明采用的技术方案是:一种基于散列表的双向机顶盒会话信息维护方法,该方法包括以下步骤:
1、从服务器的表示层对业务层的调用信息之中,获取发出请求的机顶盒用户的用户信息,以及所在频道对应的类名;根据用户信息与所在频道,删除会话表中用户信息相同但所在频道不同的会话;
2、以用户信息与所在频道为键,在会话表中查找对应的频道对象;用户信息与所在频道进行连接操作之后,共同作为会话表的键,而频道类对象向上转型为频道基类对象,作为值保存在会话表之中;
3、判断频道对象是否为空值;如果不为空,则表示机顶盒用户仍然处于当前会话的频道之中,转向步骤(6)继续操作,如果为空,继续以下操作;
4、表示机顶盒用户进入了一个新的频道,为机顶盒用户创建一个新的频道类的对象;
5、在会话表中插入新的会话对象映射关系,其中键为用户信息与所在频道的连接,值为新的频道类对象向上转型之后的频道基类对象;
6、更新该会话的上一次通信时间;
7、以机顶盒调用何种方法为依据,结束会话或者调用频道对象的方法进行操作,并将结果通过服务器的表示层返回给机顶盒。
上面所述的用户信息是一个容器类Vector对象,该对象唯一标志机顶盒的身份信息,包括用户名、密码以及机顶盒物理地址。
上面所述会话表是一个散列表,是一个从用户信息与所在频道连接向频道类的映射关系的集合。该映射中,用户信息与所在频道的散列码hashCode由用户信息Vector对象的散列码与所在频道名字符串的散列码运算获得的整数,运算公式为:
hashCode(usrInfoAndChannel)=n×hashCode(usrInfo)+hashCode(channel)
其中n为常数,实际应用中可设置为频道的个数。
用户信息对象usrInfo的散列码由各项用户信息字符串的散列码之和运算得到,运算公式为:
其中n为常数,m为用户信息项的数目。用户各项信息以及频道名的散列码按字符串类String默认的散列码算法得到。
对于散列码相同的对象,通过链地址法解决冲突,所述会话表的初始大小设置为最大同时在线的机顶盒数目,可随着机顶盒用户的增加动态进行扩充。
上面所述频道类由频道会话信息与频道操作流程组成,该类依据其中的频道会话信息,调用数据层的接口,为机顶盒用户提供频道数据信息,不同的频道类均继承频道基类,基类中包含该次频道会话的上一次通信时间等通用信息。
上面所述守护程序是由应用服务器AS创建的一个线程,该线程每隔一定时间检测一次会话表中各会话元素的上一次通信时间,关闭连续若干小时未进行通信的会话,并从会话表中删除该会话。
由上述本发明采用的技术方案可以看出,本发明有以下有益效果:
1、采用散列表的会话信息维护方法,在查找从用户信息与所在频道所对应的频道对象时只需访问内存,不需额外的I/O操作,在散列表较大而冲突不明显的理想情况下,只需要O(1)的时间便可完成散列表的查找、删除和修改,从而避免了用数据库读写完成会话信息维护的方法在时间上带来开销巨大的缺点,显著提高了系统的性能。
2、由于各频道对象各自保存各自的会话信息,避免了共享HTTP协议内建对象session造成的频道模块之间高耦合带来的意外错误。
3、将会话信息与频道内部流程控制结合,使得表示层信息和其它频道信息对频道开发者透明化,有利于开发者方便迅速的开发新的频道而无需考虑其它频道。
附图说明
图1是双向机顶盒后台服务器AS中应用层的子模块图;
图2是双向机顶盒后台服务器AS接收到一次机顶盒请求之后运行的流程图。
具体实施方式
下面将结合附图对本发明的结构和实施方式组成作进一步的详细描述:
如图1所示,应用服务器AS的应用层由以下几个模块组成:
1、RMI服务模块,该模块负责建立一个RMI服务供表示层进行调用,该模块通过会话散列表映射,与频道模块进行交互。该模块在应用服务器启动时开始运行。
2、会话表模块,该模块由散列表构成,散列表的映射关系为用户信息、所在频道向频道对象的映射。该映射中,用户信息与所在频道的散列码hashCode由用户信息Vector对象的散列码与所在频道名字符串的散列码运算获得的整数,运算公式为:
hashCode(usrInfoAndChannel)=n×hashCode(usrInfo)+hashCode(channel)
其中n为常数,实际应用中可设置为频道的个数。
用户信息对象usrInfo的散列码由各项用户信息字符串的散列码之和运算得到,运算公式为:
其中n为常数,m为用户信息项的数目。用户各项信息以及频道名的散列码按字符串类String默认的散列码算法得到。
会话表模块在RMI服务开启之后建立。
3、守护程序模块,该模块为一单独的线程,在会话表创建之后启动,该程序负责每隔若干时间对会话表中的项目进行轮询,一旦该会话对应的频道对象显示用户已经连续若干小时未继续进行请求,则关闭该会话,并且将对应项目由会话表中移除。导致会话超时的原因一般是网络的异常中断,该守护程序目的是为了防止异常中断的会话耗费服务器过多的资源。在实施上,超时时间一般设置为8小时。
4、频道对象模块,该模块由互动频道的类组成,每一个互动频道对应一个类。例如,电影点播频道对应电影点播类Movie。该类中包含用户的会话信息,Movie类的movie对象包含了某一用户当前所关注的电影名称movieName,缴费账号account,以及是否已经缴费标志paid,一旦用户已经刷卡缴费,则计算账号余额并回显,并将paid设置为true,允许用户进行播放。所有的频道类都对频道基类进行继承,频道基类中包含所有频道对象共享的信息,例如用户上一次会话的时间,以提供给守护程序进行超时判断。频道对象在机顶盒用户对后台进行请求之后建立,其建立的过程见下文。
在双向机顶盒对后台进行一次请求之后,服务器的表示层将请求信息传递给应用层,应用层对该请求作出的运行过程如图2所示。
1、当应用层收到表示层的RMI调用之后,取出RMI调用参数之中的用户信息与所在频道信息;例如,用户名为user01,密码为123456,机顶盒物理地址为00-E0-4D-02-2A-49,访问频道为电影点播Movie。这些信息都包含在一个容器Vector当中。若之前存在用户信息相同,但所在频道为远程医疗Hospital的项,则将该会话项删除。
2、根据用户信息与所在频道,在会话表中查找频道对象obj,该步可以调用散列表的get()方法进行实施,以在步骤1中获取的容器vector作为键,调用会话表的成员方法hashMap.get(vector),获取频道对象obj。
3、判断频道对象obj是否空,若为空有两个原因,机顶盒用户刚进入第一个频道或者机顶盒用户退出了旧的频道进入了新的频道。若不为空则表示机顶盒用户仍处于刚才的频道之中,跳转到步骤6,否则继续如下操作。
4、新创建访问频道名所对应的频道,例如频道名为Movie,则新建Movie类的对象obj。
5、将用户信息与频道名向频道对象的映射加入会话表。该步骤可以调用散列表的add()方法进行实施,例如,调用会话表的成员方法hashMap.add(vector,obj),将映射关系加入会话表,创建新的会话。
6、更新该会话的上一次通信时间,交由守护程序进行超时判断处理。该步骤可以由设置频道类基类的成员变量进行实施,该成员变量必须是守护程序有权限进行读取的。
7、以机顶盒调用何种方法为依据,结束会话或者调用频道对象的方法进行操作,并将结果通过服务器的表示层返回给机顶盒。该步骤如何操作,取决于机顶盒用户进行操作所调用的方法名。例如用户按下了获取最新电影列表按钮,调用方法名为getNewestMovieList,RMI服务模块在接收到该请求之后,调用频道对象的getNewestMovieList方法,进行数据读取,并将结果返回给表示层。又例如用户按下了退出电影点播频道的按钮,调用方法名为quitChannel,后台则将会话表中对应项去除,结束会话,该步骤可以调用散列表的remove()方法进行实施。