一种消息锁处理方法及装置与流程

文档序号:15737210发布日期:2018-10-23 21:41阅读:267来源:国知局

本发明涉及数据传输领域,尤其涉及一种消息锁处理方法及装置。



背景技术:

android设备与服务端的通信方式主要有两种,一种是http通信,另一种是socket(套接字)通信。两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务端发送请求后,服务端才能向客户端返回数据。而socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端向服务端发送请求。在程序内部提供了与外界通信的端口,即端口通信。通过建立socket连接,可为通信双方的数据传输传提供通道。socket通信有数据丢失率低,使用简单且易于移植的优点。

在游戏领域,游戏客户端会因为断网等原因发生与游戏服务端之间的断线重连、游戏界面也会在断线重连成功后重新打开,而游戏界面的重新打开需要耗费一定时间,在游戏界面未重新打开之前,游戏服务端可能会下发新的socket消息,触发游戏客户端从本地数组中取出socket消息进行处理,从而,由于游戏界面还未打开,当前处理的socket消息会被浪费掉,而游戏过程中的socket消息是一环扣一环的,进而导致后续的socket消息也无法被处理,进而导致游戏过程卡住。



技术实现要素:

本发明实施例通过提供一种消息锁处理方法及装置,解决了断线重连后游戏过程卡住的技术问题。

第一方面,本发明实施例提供一种消息锁处理方法,应用于游戏客户端,其特征在于,包括:

监控所述游戏客户端与游戏服务端之间是否发生断线重连;

如果是,对所述游戏客户端的本地数组加锁,触发从所述本地数组中取出第一套接字socket消息的事件中断,其中,所述第一socket消息为在所述游戏客户端与所述游戏服务端之间发生断线重连之前存入所述本地数组的至少一个socket消息;

在所述游戏客户端与所述游戏服务端之间重新处于连接状态下,若监控到所述游戏客户端的游戏界面重新打开,对所述本地数组解锁;

向所述本地数组中存入第二socket消息,触发对从所述本地数组中取出所述第一socket消息和所述第二socket消息进行处理的事件执行。

可选的,在监控所述游戏客户端与游戏服务端之间是否发生断线重连之后,还包括如下步骤:

步骤a、在所述游戏客户端与所述游戏服务端之间发生断线重连之前,若接收到当前socket消息,存储所述当前socket消息至所述本地数组;

步骤b、从所述本地数组中取出所述当前socket消息进行处理,基于处理得到的游戏数据进行游戏过程;

重复执行所述步骤a至步骤b,直至所述游戏客户端与所述游戏服务端之间发生所述断线重连。

可选的,所述从所述本地数组中取出所述当前socket消息进行处理,包括:

判断所述本地数组中当前是否存在未处理的socket消息;

如果是,从所述本地数组中取出所述未处理的socket消息进行处理,否则将用于从所述本地数组中取出socket消息进行处理的进程处于阻塞状态,直到向所述本地数组中存入所述当前socket消息,从所述本地数组中取出所述当前socket消息进行处理。

可选的,所述向所述本地数组中存入第二socket消息,触发对从所述本地数组中取出所述第一socket消息和所述第二socket消息进行处理的事件执行,包括:

向所述游戏服务端发送空消息,所述空消息用于触发所述游戏服务端向所述游戏客户端反馈所述第二socket消息;

接收并存储所述第二socket消息至所述本地数组;

以存储所述第二socket消息至所述本地数组的事件,触发对从所述本地数组中顺次取出所述第一socket消息和所述第二socket消息进行处理的事件执行。

可选的,所述向所述本地数组中存入第二socket消息,触发对从所述本地数组中取出所述第一socket消息和所述第二socket消息进行处理的事件执行,包括:

等待所述游戏服务端主动下发所述第二socket消息;

将所述游戏服务端主动下发的所述第二socket消息存储至所述本地数组;

以存储所述第二socket消息至所述本地数组的事件,触发对从所述本地数组中顺次取出所述第一socket消息和所述第二socket消息进行处理的事件执行。

可选的,所述接收到当前socket消息,包括:

接收来自所述游戏服务端的n个二进制消息块,其中,所述n个二进制消息块为所述游戏服务端下发的原始socket消息被拆分为所述n个二进制消息块,将所述n个二进制消息块传送至所述游戏客户端,n为大于或等于1的整数;

将所述n个二进制消息块拼接为二进制完整消息;

解析所述二进制完整消息,获得所述当前socket消息。

可选的,所述原始socket消息包括消息头和消息体,所述消息头中指明消息体长度,所述原始socket消息被拆分后,所述消息体长度携带在所述n个二进制消息块的第一个二进制消息块中;

所述将所述n个二进制消息块拼接为二进制完整消息体,包括:

接收来自所述游戏服务端的所述n个二进制消息块的第一个二进制消息块;

从所述n个二进制消息块的第一个二进制消息块中识别出所述消息体长度;

根据所述消息体长度,接收所述n个二进制消息块中在第一个二进制消息块之后的n-1个二进制消息块;

拼接所述n个二进制消息块,得到所述二进制完整消息。

第二方面,本发明实施例提供一种消息锁处理装置,应用于游戏客户端,包括:

断线重连单元,用于监控所述游戏客户端与游戏服务端之间是否发生断线重连;

加锁单元,用于如果所述断线重连单元的监控结果为是,对所述游戏客户端的本地数组加锁,触发从所述本地数组中取出第一套接字socket消息的事件中断,其中,所述第一socket消息为在所述游戏客户端与所述游戏服务端之间发生断线重连之前存入所述本地数组的至少一个socket消息;

数组解锁单元,用于在所述游戏客户端与所述游戏服务端之间重新处于连接状态下,若监控到所述游戏客户端的游戏界面重新打开,对所述本地数组解锁;

消息处理触发单元,用于向所述本地数组中存入第二socket消息,触发对从所述本地数组中取出所述第一socket消息和所述第二socket消息进行处理的事件执行。

可选的,所述装置还包括:消息处理单元,用于执行如下步骤:

步骤a、在所述游戏客户端与所述游戏服务端之间发生断线重连之前,若接收到当前socket消息,存储所述当前socket消息至所述本地数组;

步骤b、从所述本地数组中取出所述当前socket消息进行处理,基于处理得到的游戏数据进行游戏过程;

重复执行所述步骤a至步骤b,直至所述游戏客户端与所述游戏服务端之间发生所述断线重连。

可选的,所述消息处理单元,具体包括:

判断子单元,用于判断所述本地数组中当前是否存在未处理的socket消息;

消息处理执行子单元,用于如果所述判断子单元的判断结果是,从所述本地数组中取出所述未处理的socket消息进行处理,否则将用于从所述本地数组中取出socket消息进行处理的进程处于阻塞状态,直到向所述本地数组中存入所述当前socket消息,从所述本地数组中取出所述当前socket消息进行处理。

可选的,所述消息处理触发单元,包括:

消息发送子单元,用于向所述游戏服务端发送空消息,所述空消息用于触发所述游戏服务端向所述游戏客户端反馈所述第二socket消息;

原始socket消息存储子单元,用于接收并存储所述第二socket消息至所述本地数组;

第一触发子单元,用于以存储所述第二socket消息至所述本地数组的事件,触发对从所述本地数组中顺次取出所述第一socket消息和所述第二socket消息进行处理的事件执行。

可选的,所述消息处理触发单元,包括:

等待消息子单元,用于等待所述游戏服务端主动下发所述第二socket消息;

第二消息存储子单元,用于将所述游戏服务端主动下发的所述第二socket消息存储至所述本地数组;

第二触发子单元,用于以存储所述第二socket消息至所述本地数组的事件,触发对从所述本地数组中顺次取出所述第一socket消息和所述第二socket消息进行处理的事件执行。

可选的,所述消息处理单元,还包括:

消息块接收单元,用于接收来自所述游戏服务端的n个二进制消息块,其中,所述n个二进制消息块为所述游戏服务端下发的原始socket消息被拆分为所述n个二进制消息块,将所述n个二进制消息块传送至所述游戏客户端,n为大于或等于1的整数;

消息块拼接单元,用于将所述n个二进制消息块拼接为二进制完整消息;

消息解析单元,用于解析所述二进制完整消息,获得所述当前socket消息。

可选的,所述原始socket消息包括消息头和消息体,所述消息头中指明消息体长度,所述原始socket消息被拆分后,所述消息体长度携带在所述n个二进制消息块的第一个二进制消息块中;

所述消息块拼接单元,具体用于:

接收来自所述游戏服务端的所述n个二进制消息块的第一个二进制消息块;

从所述n个二进制消息块的第一个二进制消息块中识别出所述消息体长度;

根据所述消息体长度,接收所述n个二进制消息块中在第一个二进制消息块之后的n-1个二进制消息块;

拼接所述n个二进制消息块,得到所述二进制完整消息。

第三方面,本发明实施例提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现第一方面中任一实施方式所述的消息锁处理方法。

第四方面,本发明实施例提供一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现第一方面中任一实施方式所述的消息锁处理方法。

本发明实施例中提供的一个或多个技术方案,至少具有如下技术效果或优点:

通过监控游戏客户端与游戏服务端之间是否发生断线重连;如果发生,对游戏客户端的本地数组加锁,触发从所述本地数组中取出第一套接字socket消息的事件中断,而在游戏客户端与所述游戏服务端之间重新处于连接状态下,游戏客户端的游戏界面重新打开时对本地数组解锁;再向本地数组中存入第二socket消息,触发对从本地数组中取出第一socket消息和第二socket消息进行处理的事件执行,因此,确保了在游戏界面重新打开之前不会从本地数组中取出socket消息处理,在游戏界面重新打开之后,才取出socket消息进行处理,因此没有socket消息被浪费掉,因此,游戏过程能够在游戏界面重新打开之后顺利进行。

附图说明

为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本发明实施例提供的消息锁处理方法的流程图;

图2为本发明实施例提供的消息锁处理装置的程序模块图;

图3为本发明实施例提供的计算机可读存储介质的结构示意图;

图4为本发明实施例提供的计算机设备的结构示意图。

具体实施方式

本发明实施例通过提供一种消息锁处理方法及装置,解决了现有技术中socket通信的处理效率较低的技术问题。

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

本发明实施例提供的一种消息锁处理方法,应用于游戏客户端。参考图1所示,图1为本发明实施例提供的消息锁处理方法的流程图,包括如下步骤:

s101、监控所述游戏客户端与游戏服务端之间是否发生断线重连。

具体的,若所述游戏客户端当前处于游戏过程中,监控所述游戏客户端与游戏服务端之间是否发生断线重连。

监控所述游戏客户端与游戏服务端之间发生断线重连,具体为:游戏客户端与游戏服务端之间的连接断开之后,比如,断网、网络切换等,游戏客户端重新向游戏服务端发起用于请求与服务端建立连接的请求,游戏服务端响应于该请求,重新建立与游戏客户端之间的连接。则,这一过程为所述游戏客户端与游戏服务端之间的断线重连过程。

在步骤s101之后,执行步骤s102:监控到游戏客户端与游戏服务端之间发生断线重连时,对游戏客户端的本地数组加锁,触发从本地数组中取出第一socket消息的事件中断。

具体的,需要说明的是,第一socket消息为游戏客户端与游戏服务端之间在发生断线重连之前,存入所述本地数组的至少一个socket消息,各socket消息中携带有所述游戏客户端正在进行的游戏过程的游戏数据。

需要说明的是,本地数组创建在游戏客户端中,游戏客户端与游戏服务端之间发生断线重连,游戏客户端与游戏服务端之间处于连接状态。在游戏客户端与游戏服务端之间处于连接状态,游戏客户端进行如下过程:

步骤a:游戏客户端接收当前socket消息,存储所述当前socket消息至所述本地数组。

步骤b:从所述本地数组中取出所述当前socket消息进行处理,基于对所述当前socket消息处理得到的游戏数据进行所述游戏客户端当前正在进行的游戏过程。

重复执行所述步骤a至步骤b,直至所述游戏客户端与所述游戏服务端之间发生断线重连。

具体的,在步骤b中,从所述本地数组中取出所述当前socket消息进行处理,具体实施方式可以如下:

判断所述本地数组中当前是否存在未处理的socket消息,如果所述本地数组中存在未处理的socket消息,从所述本地数组中取出所述未处理的socket消息进行处理,否则将用于从所述本地数组中取出socket消息进行处理的进程处于阻塞状态,直到所述本地数组中存入当前socket消息,从所述本地数组中取出所述当前socket消息进行处理。

具体来讲,在本地数组中存入当前socket消息时,用于从所述本地数组中取出socket消息进行处理的进程从阻塞状态,切换至就绪状态,再由就绪状态切换至工作状态,执行从所述本地数组中取出所述当前socket消息进行处理的动作。

需要说明的是,本实施例中,处于阻塞状态,具体为:用于从所述本地数组中取出socket消息进行处理的进程,在本地数组中没有未处理的socket消息时,因等待当前socket消息存入本地数组而暂时不能运行的状态。

在具体实施过程中,游戏客户端与游戏服务端之间断线重连成功,游戏客户端与游戏服务端之间会恢复至连接状态,并且恢复至连接状态之后,客户端的游戏界面会重新打开。但是由于游戏客户端的游戏界面重新打开需要占用一定时间,具体来讲,在游戏资源较大时,游戏界面重新打开可能需要耗费一秒以上。因此,在等待游戏界面重新打开的时间段内,由于游戏客户端与游戏服务端之间已经恢复至连接状态,可能游戏服务端会有第二socket消息下发给游戏客户端,而一旦将第二socket消息下发,游戏客户端就会存储第二socket消息存储至本地数组,就会触发对从本地数组中取出其中的第一socket消息和第二socket消息进行处理的事件执行。而由于这时游戏界面还未重新打开,会导致当前取出的socket消息浪费掉,游戏过程中所应用到的socket消息是一环扣一环的,由于当前socket消息浪费掉,会导致后续取出的socket消息也无法被游戏过程所使用,进而导致游戏卡起。因此,在本发明实施例中,在游戏客户端与游戏服务端之间发生断线重连时,对游戏客户端的本地数组加锁,触发从对本地数组中取出第一socket消息的事件中断,也就不会再从本地数组中取出任何socket消息来进行处理。直到游戏界面重新打开,才解锁本地数组。使得本地数组中的socket消息才能被取出。因此,在步骤s102之后,接着执行步骤s103。

步骤s103:在所述游戏客户端与游戏服务端之间重新处于连接状态下,若监控到所述游戏客户端的游戏界面重新打开,对所述本地数组解锁。

在具体实施过程中,在对本地数组的解锁,本地数组中的第一socket消息能够被取出,但是用于从所述本地数组中取出socket消息进行处理的进程处于阻塞状态,因此,无法执行从本地数组中取出第一socket消息的动作。因此,此时,仍然不会从本地数组中取出第一socket消息进行处理。需要再向本地数组存入socket消息,才能触发用于从所述本地数组中取出socket消息进行处理的进程从阻塞状态转换至就绪状态,再转换至执行状态,执行将本地数组中未处理的socket消息取出进行处理的动作。因此,在步骤s103之后,执行步骤s104。

s104:向所述本地数组中存入第二socket消息,触发对从所述本地数组中取出所述第一socket消息和所述第二socket消息进行处理的事件执行。

需要说明的是,第二socket消息为在游戏客户端与游戏服务端之间在断线重连成功之后,接收到游戏服务端下发的socket消息。

在具体实施过程中,针对步骤s104有两种实施方式:

实施方式一:在步骤s103之后,等待所述游戏服务端主动下发所述第二socket消息;将所述游戏服务端主动下发的所述第二socket消息存储至所述本地数组;以存储所述第二socket消息至所述本地数组的事件,触发对从所述本地数组中顺次取出所述第一socket消息和所述第二socket消息进行处理的事件执行。

但是由于所述游戏客户端的游戏界面重新打开时,即使所述本地数组已经解锁,但是不一定游戏服务端立即就会下发第二socket消息,而只能等待,导致在游戏界面重新打开后,游戏过程可能无法立即继续进行。

为了能够在游戏客户端的游戏界面重新打开时,游戏过程能够立即继续,本发明给出另一优选的实施方式:

实施方式二:向所述游戏服务端发送空消息,所述空消息用于触发所述游戏服务端向所述游戏客户端反馈所述第二socket消息;接收并存储所述第二socket消息至所述本地数组;以存储所述第二socket消息至所述本地数组的事件,触发对从所述本地数组中顺次取出所述第一socket消息和第二socket消息进行处理的事件执行。

通过实施方式二,能够实现在游戏客户端的游戏界面重新打开时,立即接收到游戏服务端下发的第二socket消息,从而加快了游戏客户端与游戏服务端之间断线重连之后游戏恢复的速度,减少了游戏用户等待的时间。

在具体实施过程中,顺次取出所述第一socket消息和第二socket消息进行处理,具体实现过程为:以先存先取的方式进行存取,即:先取第一socket消息,对第一socket消息进行处理之后,再取第二socket消息,对第二socket消息进行处理。

具体的,为了提高游戏服务端与游戏客户端之间socket通信的处理效率较低,所述接收到当前socket消息,具体可以包括如下步骤:

首先,执行步骤a1、接收来自所述游戏服务端的n个二进制消息块,其中,所述n个二进制消息块为所述游戏服务端下发的原始socket消息被拆分为所述n个二进制消息块,将所述n个二进制消息块传送至所述游戏客户端,n为大于或等于1的整数;

在步骤a1之后,接着执行步骤a2、将所述n个二进制消息块拼接为二进制完整消息;

在步骤a2之后,接着执行步骤a3、解析所述二进制完整消息,获得所述当前socket消息。

由于接收来自游戏服务端的n个二进制消息块,n个二进制消息块为游戏服务端下发的原始socket消息被拆分为n个二进制消息块,并以n个二进制消息块传送至游戏客户端,从而信息数据能够能够以二进制流向游戏客户端,游戏客户端在接收到n个二进制消息块,直接就可以将n个二进制消息块拼接为二进制完整消息;并且解析二进制完整消息获得与二进制完整消息对应的游戏客户端当前游戏过程所需的游戏数据,而不需要经过转换为字符串的过程,而转换为字符串是比较耗时的,因此,通过二进制传送消息至游戏客户端,能够提高socket通信的处理效率。

下面,对游戏客户端与游戏服务端之间建立连接的过程进行描述:

步骤b1、游戏服务端监听连接请求:游戏服务端当前的套接字(socket)并不定位具体的客户端的套接字socket,而是处于等待连接的状态,实时监控网络状态,等待socket客户端的连接请求。需要说明的是,游戏客户端为游戏服务端所监听连接请求的socket客户端中的一个。

步骤b2、游戏客户端发起连接请求:游戏客户端向游戏服务端发起连接请求,连接请求中携带有需要连接的游戏服务端的套接字(socket)。游戏客户端的套接字(socket)首先描述所要连接的游戏服务端的套接字(socket)。具体的,是通过指出游戏服务端的套接字(socket)的地址和端口号,向游戏服务端的socket提出连接请求。

步骤b3、连接确认:当游戏服务端的套接字(socket)监听到或者接收到游戏客户端的套接字(socket)的连接请求时,就响应于游戏客户端的套接字(socket)的连接请求,建立一个新的线程,把游戏服务端的套接字(socket)的描述发给游戏客户端,一旦游戏客户端确认了此描述,游戏客户端就与游戏服务端正式建立socket连接。而游戏服务端的套接字(socket)继续处于监听状态,继续接收其他的socket客户端的套接字(socket)的连接请求。

游戏客户端与游戏服务端正式建立socket连接之后,接收来自游戏服务端的n个二进制消息块。

具体来讲,如果游戏服务端需要向游戏客户端下发原始socket消息,则游戏服务端将原始socket消息拆分为n个二进制消息块,传送所述n个二进制消息块至所述游戏客户端。

需要说明的是,二进制消息块是指以“0”、“1”形式存在的消息块。

具体的,原始socket消息包括消息体和一个消息头,消息头中包含有用于记录所述消息体的长度的参数:消息体长度,消息体中携带游戏客户端当前游戏过程所需的游戏数据。原始socket消息拆分为二进制消息块的数目“n”与原始socket消息中消息体长度相关。同时的,数目“n”还与游戏客户端与游戏服务端之间传送二进制消息的二进制流限制相关。在具体实施过程中,原始socket消息中消息体长度越长,n的数值越大,即原始socket消息拆分为二进制消息块的数目n就越多,相反的,原始socket消息中消息体长度越短,n的数值就越小,即拆分为二进制消息块的数目n就越少。具体来讲,数目“n”的值等于原始socket消息的消息头中记录的消息体长度除以二进制流限制。

需要说明的是,二进制流限制为游戏客户端与游戏服务端之间传输二进制消息的字节上限。

在具体实施过程中,游戏服务端将n个二进制消息块依次向游戏客户端传送,从而游戏客户端依次接收到n个二进制消息的第一个二进制消息块、第二个二进制消息块、第三个二进制消息块,直到接收到第n个二进制消息块。

在原始socket消息被拆分后,所述消息头在所述n个二进制消息块中的第一个二进制消息块中。在具体实施过程中,可以用4字节无符号整数表示在消息头中表示出消息体长度这一参数。第一个二进制消息块之后的各个二进制消息中携带的均为消息体中游戏客户端当前游戏过程所需的游戏数据的内容。

游戏客户端将所述n个二进制消息块拼接为二进制完整消息体的实施过程,具体包括:

首先,执行步骤a:接收来自游戏服务端的n个二进制消息块中的第一个二进制消息块;

在步骤a之后,接着执行步骤b:从所述n个二进制消息块的第一个二进制消息块中识别出原始socket消息的消息体长度。

具体而言,先识别出原始socket消息中的消息头,再从消息头中识别出在消息头中记录的消息体长度。具体而言,消息头中还可以记录有消息体类型,比如,消息体类型是指传送的是图片内容、文字内容、还是语音内容。

在步骤b之后,接着执行步骤c:根据原始socket消息中的消息头中记录的消息体长度,接收所述n个二进制消息块中在第一个二进制消息块之后的各个二进制消息块。

在一实施方式中,步骤c具体为:如果第一个二进制消息块中数据部分的长度大于或等于消息头中记录的消息体长度,则确定第一个二进制消息块为所述二进制完整消息;否则,等待接收在第一个二进制消息块之后的各个二进制消息块,直到接收到的包括所述第一个二进制消息块在内的各个二进制消息块的数据总长度达到所述消息头中记录的消息体长度,则此时,接收到的全部二进制消息块为对应为原始socket消息拆分为的n个二进制消息块。

在目标信息的数据量足够小时,具体而言,小于或等于消息头中记录的消息体长度,则可以不拆分,以一个二进制消息块就可以传送。比如,消息头中记录的消息体长度这一参数为32kb,则如果接收到的第一个二进制消息块中的数据部分有32kb或者更多,则接收到第一个二进制消息块就确定一条消息接受完,确定第一个二进制消息块为原始socket消息对应的二进制完整消息,而不会等待接收后续的二进制消息块。

在步骤c之后,接着执行步骤d:拼接所述n个二进制消息块,得到所述二进制完整消息。

基于同一发明构思,本发明实施例提供一种消息锁处理装置,应用于游戏客户端,参考图2所示,包括:

断线重连单元201,用于监控所述游戏客户端与游戏服务端之间是否发生断线重连;

加锁单元202,用于如果所述断线重连单元的监控结果为是,对所述游戏客户端的本地数组加锁,触发从所述本地数组中取出第一套接字socket消息的事件中断,其中,所述第一socket消息为在所述游戏客户端与所述游戏服务端之间发生断线重连之前存入所述本地数组的至少一个socket消息;

数组解锁单元203,用于在所述游戏客户端与所述游戏服务端之间重新处于连接状态下,若监控到所述游戏客户端的游戏界面重新打开,对所述本地数组解锁;

消息处理触发单元204,用于向所述本地数组中存入第二socket消息,触发对从所述本地数组中取出所述第一socket消息和所述第二socket消息进行处理的事件执行。

可选的,所述装置还包括:消息处理单元,用于执行如下步骤:

步骤a、在所述游戏客户端与所述游戏服务端之间发生断线重连之前,若接收到当前socket消息,存储所述当前socket消息至所述本地数组;

步骤b、从所述本地数组中取出所述当前socket消息,并对取出后的所述当前socket消息进行处理,基于处理得到的游戏数据进行游戏过程;

重复执行所述步骤a至步骤b,直至所述游戏客户端与所述游戏服务端之间发生所述断线重连。

可选的,所述消息处理单元,具体包括:

判断子单元,用于判断所述本地数组中当前是否存在未处理的socket消息;

消息处理执行子单元,用于如果所述判断子单元的判断结果是,从所述本地数组中取出所述未处理的socket消息进行处理,否则将用于从所述本地数组中取出socket消息进行处理的进程处于阻塞状态,直到向所述本地数组中存入所述当前socket消息,从所述本地数组中取出所述当前socket消息进行处理。

可选的,所述消息处理触发单元,包括:

消息发送子单元,用于向所述游戏服务端发送空消息,所述空消息用于触发所述游戏服务端向所述游戏客户端反馈所述第二socket消息;

原始socket消息存储子单元,用于接收并存储所述第二socket消息至所述本地数组;

第一触发子单元,用于以存储所述第二socket消息至所述本地数组的事件,触发对从所述本地数组中顺次取出所述第一socket消息和所述第二socket消息进行处理的事件执行。

可选的,所述消息处理触发单元,包括:

等待消息子单元,用于等待所述游戏服务端主动下发所述第二socket消息;

第二消息存储子单元,用于将所述游戏服务端主动下发的所述第二socket消息存储至所述本地数组;

第二触发子单元,用于以存储所述第二socket消息至所述本地数组的事件,触发对从所述本地数组中顺次取出所述第一socket消息和所述第二socket消息进行处理的事件执行。

可选的,所述消息处理单元,还包括:

消息块接收单元,用于接收来自所述游戏服务端的n个二进制消息块,其中,所述n个二进制消息块为所述游戏服务端下发的原始socket消息被拆分为所述n个二进制消息块,将所述n个二进制消息块传送至所述游戏客户端,n为大于或等于1的整数;

消息块拼接单元,用于将所述n个二进制消息块拼接为二进制完整消息;

消息解析单元,用于解析所述二进制完整消息,获得所述当前socket消息。

可选的,所述原始socket消息包括消息头和消息体,所述消息头中指明消息体长度,所述原始socket消息被拆分后,所述消息体长度携带在所述n个二进制消息块的第一个二进制消息块中;

所述消息块拼接单元,具体用于:

接收来自所述游戏服务端的所述n个二进制消息块的第一个二进制消息块;

从所述n个二进制消息块的第一个二进制消息块中识别出所述消息体长度;

根据所述消息体长度,接收所述n个二进制消息块中在第一个二进制消息块之后的n-1个二进制消息块;

拼接所述n个二进制消息块,得到所述二进制完整消息。

基于同一发明构思,本发明实施例提供了一种计算机可读存储介质501,参考图3所示,其上存储有计算机程序302,该程序302被处理器执行时实现前述应用于游戏客户端的消息锁处理方法实施例中任一个实施方式所述的步骤,或者实现应用于游戏服务端的消息锁处理方法实施例中任一个实施方式所述的步骤。

基于同一发明构思,本发明实施例提供了一种计算机设备400,参考图4所示,包括存储器410、处理器430及存储在存储器410上并可在处理器430上运行的计算机程序420,所述处理器430执行所述程序420时实现前述应用于游戏客户端的消息锁处理方法实施例中任一个实施方式所述的步骤,或者实现应用于游戏服务端的消息锁处理方法实施例中任一个实施方式所述的步骤。

本发明实施例中提供的一个或多个技术方案,至少具有如下技术效果或优点:

通过监控游戏客户端与游戏服务端之间是否发生断线重连;如果发生,对游戏客户端的本地数组加锁,触发从所述本地数组中取出第一套接字socket消息的事件中断,而在游戏客户端与所述游戏服务端之间重新处于连接状态下,游戏客户端的游戏界面重新打开时对本地数组解锁;再向本地数组中存入第二socket消息,触发对从本地数组中取出第一socket消息和第二socket消息进行处理的事件执行,因此,确保了在游戏界面重新打开之前不会从本地数组中取出socket消息处理,在游戏界面重新打开之后,才取出socket消息进行处理,因此没有socket消息被浪费掉,因此,游戏过程能够在游戏界面重新打开之后顺利进行。

尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。

显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1