发明内容
本发明的主要目的在于提供一种消息分发方法、装置、终端及存储介质,旨在解决现有技术中消息分发模块臃肿,分发效率低的技术问题。
为实现上述目的,本发明实施例第一方面提供一种消息分发方法,包括:
接收服务器发送的消息,缓存所述消息至一级分发函数;
在所述一级分发函数内,判断所述消息是否有效,若所述消息有效,则发送所述消息给二级分发函数,所述有效消息内包括消息的接收对象;
在所述二级分发函数内,按照预设规则,根据所述消息,确认消息处理对象,并发送所述消息及所述消息处理对象给三级分发函数;
在所述三级分发函数内,调用所述消息处理对象,解析所述消息,得到所述消息的消息接收对象,并分发所述消息给所述消息接收对象。
本发明实施例第二方面提供一种消息分发装置,包括:
接收模块,用于接收服务器发送的消息;
缓存模块,用于缓存所述消息至一级分发函数;
判断模块,用于在所述一级分发函数内,判断所述消息是否有效;
第一发送模块,用于若所述消息有效,则发送所述消息给二级分发函数,所述有效消息内包括消息的接收对象;
第二发送模块,用于发送所述消息及所述消息处理对象给三级分发函数;
解析模块,用于在所述三级分发函数内,调用所述消息处理对象,解析所述消息,得到所述消息的消息接收对象;
分发模块,用于分发所述消息给所述消息接收对象;
所述装置还包括:
丢弃输出模块,用于若所述消息无效,则丢弃所述消息,并输出消息无效的提示信息;
确认模块,用于在所述二级分发函数内,按照预设规则,根据所述消息,确认消息处理对象。
本发明实施例第三方面提供了一种终端,包括:
存储器,处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现本发明实施例第一方面提供的消息分发方法。
本发明实施例第四方面提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现本发明实施例第一方面提供的消息分发方法。
从上述本发明实施例可知,本发明提供的消息分发方法、装置、终端及存储介质,将消息缓存至一级分发函数,在一级分发函数内,首先判断消息是否有效,若消息有效,则发送消息给二级分发函数,有效消息内包括消息的接收对象,然后,在二级分发函数内,按照预设规则,根据该消息,确认消息处理对象,并发送消息及消息处理对象给三级分发函数,最后,在三级分发函数内,调用消息处理对象,解析消息,得到消息的消息接收对象,分发消息给消息接收对象,通过将消息进行三级分发,分发到对应的消息接收对象中,提高分发效率,避免分发函数直接获取到消息接收对象而造成的臃肿现象。
具体实施方式
为使得本发明的发明目的、特征、优点能够更加的明显和易懂,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而非全部实施例。基于本发明中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
请参阅图1,图1为本发明第一实施例提供的消息分发方法的流程示意图,该方法主要包括以下步骤:
S101、接收服务器发送的消息,缓存该消息至一级分发函数;
具体的,客户端内有一个消息的统一入口,即一级分发函数,当客户端接收到服务器发送的消息之后,通过该入口,客户端将服务器发送的消息缓存至客户端。
服务器发送到客户端的消息为编码后的一定格式拼接成的字符串。
S102、在一级分发函数内,判断消息是否有效,若消息有效,则发送该消息给二级分发函数,有效消息内包括消息的接收对象;
对象之间进行通信的结构叫做消息。在对象的操作中,当一个消息发送给某个对象时,消息包含接收对象去执行某种操作的信息。消息内至少包括消息名(即对象名或方法名)和接收该消息的对象名。
现有技术中,均在一个类中进行消息分发,没有一级分发函数对无效消息进行处理,当无效消息得不到处理时,客户端容易产生崩溃,程序的稳定性差,本发明实施例增加一级分发函数,在一级分发函数中对无效消息进行处理,在提高程序稳定性的同时实现了模块的独立。
S103、在二级分发函数内,按照预设规则,根据消息,确认消息处理对象,并发送消息及消息处理对象给三级分发函数;
当消息传递到二级分发函数,证明该消息是一条有效的消息,按照预设规则,根据该消息,确认出消息处理对象,并将消息和消息处理对象发送给三级分发函数。
其中,消息处理对象,即能够处理该消息的对象。
S104、在三级分发函数内,调用消息处理对象,解析消息,得到消息的消息接收对象,并分发消息给消息接收对象。
由于消息中包含有消息的接收对象,调用能够处理该消息的对象,即消息处理对象,解析该消息,得到该消息的消息接收对象,既而将该消息分发给该消息接收对象。
在本发明实施例中,将消息缓存至一级分发函数,在一级分发函数内,首先判断消息是否有效,若消息有效,则发送消息给二级分发函数,有效消息内包括消息的接收对象,然后,在二级分发函数内,按照预设规则,根据该消息,确认消息处理对象,并发送消息及消息处理对象给三级分发函数,最后,在三级分发函数内,调用消息处理对象,解析消息,得到消息的消息接收对象,分发消息给消息接收对象,通过将消息进行三级分发,分发到对应的消息接收对象中,提高分发效率,避免分发函数直接获取到消息接收对象而造成的臃肿现象。
请参阅图2,图2为本发明第二实施例提供的消息分发方法的流程示意图,该方法主要包括以下步骤:
S201、接收服务器发送的消息,缓存消息至一级分发函数;
具体的,客户端内有一个消息的统一入口,即一级分发函数,示例性的,该函数为deliverMessage,该函数中有一个参数是message,可用于接收消息,当客户端接收到服务器发送的消息之后,通过deliverMessage函数,将服务器发送的消息缓存至客户端。
其中,服务器发送到客户端的消息为编码后的一定格式拼接成的字符串。编码格式可为ASCII,Unicode,UTF-8,GB2312等。例如,采用ASCII编码格式,待编码消息为空格“space”,则编码后将其转换为00100000。
S202、在一级分发函数内,判断该消息是否为空;
由于消息的形式为一定格式拼接成的字符串,判断该消息是否为空,即判断该消息的长度是否等于0。
若该消息为空,则执行步骤S203:丢弃该消息,并输出消息无效的提示信息。若该消息不为空,则执行步骤S204:解析该消息,得到该消息的消息类型。然后执行步骤S205:判断该消息类型是否为预设消息类型。若该消息类型为预设消息类型,则执行步骤S206:发送该消息给二级分发函数。若该消息不为预设消息类型,则执行步骤S203。
具体的,若消息的长度等于0,表示该消息为空消息,则丢弃该消息,并输出消息无效的提示信息。若该消息的长度不等于0,表示该消息不为空消息,进一步的,从message中解析该消息,得到该消息的消息类型,示例性的,消息message由三个部分组成,分别为type、name和age,type=@A,name=@B, age=@18,其中type表示该消息的消息类型。调用消息解析方法Gedecoder解析该消息,从中可获得该消息的消息类型,即消息类型type=A。
然后,判断该消息类型是否为预设消息类型,示例性的,在客户端中维护了一个预设数组,数组中存放了可以被处理的消息类型,如果该消息类型在预设数组中,则表示该消息类型为预设消息类型,可将该消息发送到二级分发函数。若该消息类型不在预设数组中,则表示该消息类型不为预设消息类型,该消息为无效消息,则执行步骤S203:丢弃该消息,并输出消息无效的提示信息。
其中,消息类型是指文本消息TextMessage、流消息StreamMessage,键值对消息MapMessage,对象消息ObjectMessage以及字节消息BytesMessage等。可理解的,预设数组内可存放上述其中一种或多种消息类型。
现有技术中,均在一个类中进行消息分发,没有一级分发函数对无效消息进行处理,当无效消息得不到处理时,客户端容易产生崩溃,程序的稳定性差,本发明实施例增加一级分发函数,在一级分发函数中对无效消息进行处理,在提高程序稳定性的同时实现了模块的独立。
S207、在二级分发函数内,解析该消息,获取该消息的消息类型;
示例性的,二级分发函数为deliverMessage,该函数在二级分发中需要2 个参数,参数一为消息类型,参数二为该消息的具体内容。在deliverMessage函数内部,解析该消息,获取该消息的消息类型。
优选的,可创建一个串行队列,该串行队列执行异步方法,将消息放入该串行队列中。
其中,串行队列的特点是串行队列中的任务,必须等到前一个任务执行完成,才会继续执行下一个任务,串行队列中的任务均放到同一线程中执行。在本发明实施例中是指将消息全部放在同一线程内,处理消息时,等到前一个消息处理完成,再继续处理下一个消息。
异步是指发送一个请求,不需要等待返回,即可再发送下一个请求。在本发明实施例中是指发送一个消息,不需要等到消息处理完成,即可再发送下一个消息。
在串行队列中执行异步的方法,在本发明实施例中是指,所有消息都在一个线程中执行,并且等到前一个消息处理完成,再继续处理下一个消息。
优选的,可再次执行步骤S205:判断该消息类型是否为预设消息类型。若该消息不为预设消息类型,则执行步骤S203。若该消息类型为预设消息类型,则执行步骤S208。
S208、遍历预设键值表,按照键为该消息类型,从预设键值表中读取相应的值,预设键值表中,键为消息类型,值为可用于处理该消息类型的消息处理对象。
预设键值表,即字典,该字典中,键key为消息类型,值value是能够处理该消息类型的消息处理对象。示例性的,该消息处理对象可以为handle数组,当收到一条消息的时候就从字典中通过消息类型去找到对应的handle数组。其中,当字典中添加handle时,就将该handle添加到该handle能够处理的消息类型对应的handle数组中。
S209、发送该消息及该消息处理对象给三级分发函数;
示例性的,将消息及相应的handle数组发送给三级分发函数。
S210、在三级分发函数内,调用消息解码方法,转换该消息为decoder对象;
示例性的,三级分发函数为sendSingleMessage,在该函数内部可以拿到处理该消息的cellObj对象。然后,判断该cellObj对象是否遵守了socketManager:message:函数。若cellObj对象没有遵守该函数,则消息分发失败,输出消息分发失败的提示信息。若cellObj对象遵守了该函数,则调用消息解码方法,对这个消息进行解码,将该消息转换为decoder对象。
其中,socketManager:message:函数用于接收消息,该函数是每个cellObj对象都需要遵守的函数。
根据消息编码方式的不同,可采用不同的解码方式,例如,若消息经过 escape编码,则可通过unescape解码,若消息经过encodeURI编码,则可通过decodeURI解码。
更多的,可获取当前应用程序的主队列,将消息放入主队列中,该主队列中执行异步方法。可理解的,主队列一般为串行队列,即为在串行队列中执行异步方法。
其中,解码是指将一定格式拼接成的字符串转换为对象的过程。
S211、读取decoder对象中的消息接收对象;
S212、调用消息处理对象,分发该消息给该消息接收对象。
调用消息处理对象,即handle数组,由public void handleMessage(Messagemsg)消息分发方法将消息分发给从decoder对象中读取出的消息接收对象。
在现有技术中,没有三级分发函数。本发明实施例,设置有三级分发函数,通过二级分发函数拿到消息对应的消息处理对象,然后,在三级分发函数中,完成最后分发。
在本发明实施例中,将消息缓存至一级分发函数,在一级分发函数内,首先判断消息是否有效,若消息有效,则发送消息给二级分发函数,有效消息内包括消息的接收对象,然后,在二级分发函数内,按照预设规则,根据该消息,确认消息处理对象,并发送消息及消息处理对象给三级分发函数,最后,在三级分发函数内,调用消息处理对象,解析消息,得到消息的消息接收对象,分发消息给消息接收对象,通过将消息进行三级分发,分发到对应的消息接收对象中,提高分发效率,避免分发函数直接获取到消息接收对象而造成的臃肿现象。
请参阅图3,图3为本发明第三实施例提供的消息分发装置的结构示意图,该装置包括:
接收模块301、缓存模块302、判断模块303、第一发送模块305、丢弃输出模块304、确认模块306、第二发送模块307、解析模块308和分发模块309。
接收模块301,用于接收服务器发送的消息。
缓存模块302,用于缓存消息至一级分发函数。
判断模块303,用于在一级分发函数内,判断消息是否有效。
第一发送模块305,用于若消息有效,则发送消息给二级分发函数,该有效消息内包括消息的接收对象。
丢弃输出模块304,用于若消息无效,则丢弃消息,并输出消息无效的提示信息。
确认模块306,用于在二级分发函数内,按照预设规则,根据消息,确认消息处理对象。
第二发送模块307,用于发送消息及消息处理对象给三级分发函数。
解析模块308,用于在三级分发函数内,调用消息处理对象,解析消息,得到消息的消息接收对象。
分发模块309,用于分发消息给消息接收对象。
本发明实施例中,将消息缓存至一级分发函数,在一级分发函数内,首先判断消息是否有效,若消息有效,则发送消息给二级分发函数,有效消息内包括消息的接收对象,然后,在二级分发函数内,按照预设规则,根据该消息,确认消息处理对象,并发送消息及消息处理对象给三级分发函数,最后,在三级分发函数内,调用消息处理对象,解析消息,得到消息的消息接收对象,分发消息给消息接收对象,通过将消息进行三级分发,分发到对应的消息接收对象中,提高分发效率,避免分发函数直接获取到消息接收对象而造成的臃肿现象。
请参见图4,图4示出了一种终端的硬件结构图。
本实施例中所描述的终端,包括:
存储器41、处理器42及存储在存储器41上并可在处理器上运行的计算机程序,处理器执行该程序时实现前述图1或图2所示实施例中描述的消息分发方法。
进一步地,该终端还包括:
至少一个输入设备43;至少一个输出设备44。
上述存储器41、处理器42输入设备43和输出设备44通过总线45连接。
其中,输入设备43具体可为摄像头、触控面板、物理按键或者鼠标等等。输出设备44具体可为显示屏。
存储器41可以是高速随机存取记忆体(RAM,Random Access Memory) 存储器,也可为非不稳定的存储器(non-volatile memory),例如磁盘存储器。存储器41用于存储一组可执行程序代码,处理器42与存储器41耦合。
进一步地,本发明实施例还提供了一种计算机可读存储介质,该计算机可读存储介质可以是设置于上述各实施例中的终端中,该计算机可读存储介质可以是前述图4所示实施例中的存储器。该计算机可读存储介质上存储有计算机程序,该程序被处理器执行时实现前述图1或图2所示实施例中描述的消息分发方法。进一步地,该计算机可存储介质还可以是U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,RandomAccess Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
需要说明的是,在本发明各个实施例中的各功能模块可以集成在一个处理模块中,也可以是各个模块单独物理存在,也可以两个或两个以上模块集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。
所述集成的模块如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来。
需要说明的是,对于前述的各方法实施例,为了简便描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其它顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定都是本发明所必须的。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其它实施例的相关描述。
以上为对本发明所提供的一种消息分发方法、装置、终端及存储介质的描述,对于本领域的技术人员,依据本发明实施例的思想,在具体实施方式及应用范围上均会有改变之处,综上,本说明书内容不应理解为对本发明的限制。