消息发送方法、装置、电子设备及存储介质与流程

文档序号:26139289发布日期:2021-08-03 14:22阅读:99来源:国知局
消息发送方法、装置、电子设备及存储介质与流程

本公开涉及通信技术,尤其涉及一种消息发送方法、装置、电子设备及存储介质。



背景技术:

随着通信技术的不断发展,网络直播已成为一种新兴的社交方式,目前直播间长连接通常以直播间维度进行管理。

相关技术中,对于直播中需要点对点通信的场景,一般是利用app级的长连接进行通信。然而,利用app级的长连接进行通信,会使得端上和后端需要接入app级长连接协议,从而加大了开发成本,且引入额外通道也提高了消息到达的风险。



技术实现要素:

本公开提供一种消息发送方法、装置、电子设备及存储介质,以至少解决相关技术中通过app级长连接进行直播点对点通信导致开发成本大以及通信风险高的问题。本公开的技术方案如下:

根据本公开实施例的第一方面,提供一种消息发送方法,包括:

监听用户账户建立直播连接的连接消息,所述连接消息中包括所述用户账户的账户标识以及所述用户账户连接的直播进程;

获取待发送消息,所述待发送消息中携带有接收消息的目标账户的账户标识以及所述目标账户所在的直播间标识;

基于接收消息的目标账户的账户标识以及所述目标账户所连接的直播进程,获取对应待发送消息的存储通道,将所述待发送消息存入对应的存储通道中;

基于所述直播间标识,通过固定线程将所述存储通道中存储的所述待发送消息发送给对应的目标账户。

在其中一个实施例中,所述连接消息中还包括所述用户账户连接直播进程的连接时间;所述获取待发送消息之前,所述方法还包括:记录所述用户账户连接的直播进程以及连接时间。

在其中一个实施例中,所述记录所述用户账户连接的直播进程以及连接时间之后,所述方法还包括:监听所述用户账户建立直播连接的心跳消息,基于所述心跳消息获取所述用户账户连接的当前直播进程以及当前连接时间;在存储序列中记录所述用户账户连接的当前直播进程以及当前连接时间。

在其中一个实施例中,所述监听所述用户账户建立直播连接的心跳消息之后,所述方法还包括:若在预设时间段内未监听到所述用户账户建立直播连接的心跳消息,则删除存储通道中与所述用户账户的账户标识对应的待发送消息。

在其中一个实施例中,所述用户账户所在的直播进程为所述存储序列中时间最晚的与所述当前连接时间对应的当前直播进程。

所述将所述待发送消息存入对应的存储通道中之后,所述方法还包括:

将所述待发送消息记录在发送中队列;

并在监听到通过固定线程将所述存储通道中存储的所述待发送消息发送给对应的目标账户时,从所述发送中队列中删除所述待发送消息。

在其中一个实施例中,所述将所述待发送消息记录在发送中队列之后,所述方法还包括:在所述发送中队列中记录所述待发送消息的记录时间;周期性扫描记录在所述发送中队列中的待发送消息,若当前的扫描时间与记录所述待发送消息的记录时间之间的时间间隔超过第一设定阈值,则将所述待发送消息重新存入所述存储通道中。

在其中一个实施例中,所述周期性扫描记录在所述发送中队列中的待发送消息之后,所述方法还包括:若当前的扫描时间与记录所述待发送消息的记录时间之间的时间间隔超过第二设定阈值,则从所述发送中队列中删除所述待发送消息,所述第二设定阈值大于所述第一设定阈值。

根据本公开实施例的第二方面,提供一种消息发送装置,包括:

连接消息监听模块,被配置为执行监听用户账户建立直播连接的连接消息,所述连接消息中包括所述用户账户的账户标识以及所述用户账户连接的直播进程;

待发送消息获取模块,被配置为执行获取待发送消息,所述待发送消息中携带有接收消息的目标账户的账户标识以及所述目标账户所在的直播间标识;

存储模块,被配置为执行基于接收消息的目标账户的账户标识以及所述目标账户所连接的直播进程,获取对应待发送消息的存储通道,将所述待发送消息存入对应的存储通道中;

消息发送模块,被配置为执行基于所述直播间标识,通过固定线程将所述存储通道中存储的所述待发送消息发送给对应的目标账户。

在其中一个实施例中,所述连接消息中还包括所述用户账户连接直播进程的连接时间;所述装置还包括:记录模块,被配置为执行记录所述用户账户连接的直播进程以及连接时间。

在其中一个实施例中,所述装置还包括:心跳消息监听模块,被配置为执行监听所述用户账户建立直播连接的心跳消息,基于所述心跳消息获取所述用户账户连接的当前直播进程以及当前连接时间;所述记录模块还被配置为执行在存储序列中记录所述用户账户连接的当前直播进程以及当前连接时间。

在其中一个实施例中,所述心跳消息监听模块还被配置为执行:若在预设时间段内未监听到所述用户账户建立直播连接的心跳消息,则删除存储通道中与所述用户账户的账户标识对应的待发送消息。

在其中一个实施例中,所述用户账户所在的直播进程为所述存储序列中时间最晚的与所述当前连接时间对应的当前直播进程。

在其中一个实施例中,所述装置还包括发送中队列记录模块,被配置为执行:将所述待发送消息记录在发送中队列;并在监听到通过固定线程将所述存储通道中存储的所述待发送消息发送给对应的目标账户时,从所述发送中队列中删除所述待发送消息。

在其中一个实施例中,所述发送中队列记录模块还被配置为执行:在所述发送中队列中记录所述待发送消息的记录时间;周期性扫描记录在所述发送中队列中的待发送消息,若当前的扫描时间与记录所述待发送消息的记录时间之间的时间间隔超过第一设定阈值,则将所述待发送消息重新存入所述存储通道中。

在其中一个实施例中,所述发送中队列记录模块还被配置为执行:若当前的扫描时间与记录所述待发送消息的记录时间之间的时间间隔超过第二设定阈值,则从所述发送中队列中删除所述待发送消息,所述第二设定阈值大于所述第一设定阈值。

根据本公开实施例的第三方面,提供一种服务器,包括:处理器;用于存储所述处理器可执行指令的存储器;其中,所述处理器被配置为执行所述指令,使得服务器执行第一方面的任一项实施例中所述的消息发送方法。

根据本公开实施例的第四方面,提供一种存储介质,当所述存储介质中的指令由服务器的处理器执行时,使得服务器能够执行第一方面的任一项实施例中所述的消息发送方法。

根据本公开实施例的第五方面,提供一种计算机程序产品,所述程序产品包括计算机程序,所述计算机程序存储在可读存储介质中,设备的至少一个处理器从所述可读存储介质读取并执行所述计算机程序,使得设备执行第一方面的任一项实施例中所述的消息发送方法。

本公开的实施例提供的技术方案至少带来以下有益效果:通过监听用户账户建立直播连接的连接消息,并获取向目标账户发送的待发送消息,基于目标账户的账户标识以及目标账户所连接的直播进程,获取对应待发送消息的存储通道,将待发送消息存入对应的存储通道中,并基于直播间标识,通过固定线程将存储通道中存储的待发送消息发送给对应的目标账户,从而实现基于单一的直播长连接完成点对点通信,不仅节省了基于app实现点对点通信的开发成本,且降低了基于app实现点对点通信的依赖及风险。

应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。

附图说明

此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理,并不构成对本公开的不当限定。

图1是根据一示例性实施例示出的一种消息发送方法的流程图。

图2是根据又一示例性实施例示出的一种消息发送方法的流程图。

图3是根据再一示例性实施例示出的一种消息发送方法的流程图。

图4是根据一示例性实施例示出的一种消息发送装置的框图。

图5是根据一示例性实施例示出的一种服务器的框图。

具体实施方式

为了使本领域普通人员更好地理解本公开的技术方案,下面将结合附图,对本公开实施例中的技术方案进行清楚、完整地描述。

需要说明的是,本公开的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本公开的实施例能够以除了在这里图示或描述的那些以外的顺序实施。以下示例性实施例中所描述的实施方式并不代表与本公开相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本公开的一些方面相一致的装置和方法的例子。

由于目前直播间长连接通常以直播间维度进行管理,该种方式对直播间内广播消息支持很友好,但是对点对点通信能力的支持很不友好。因此对于需要点对点通信的场景,目前的实现方式是利用app级的长连接进行通信。而直接在现有直播长连接方案上进行点对点消息的发送,会对整个链路的存储和相关资源访问qps(queries-per-second,每秒查询率)造成直播间内用户级的放大。而继续利用app级的长连接进行通信,则端上和后端需要接入app级长连接协议,从而加大了开发成本,且引入额外通道也提高了消息到达的风险。

基于此,本公开提供了一种消息发送方法,该方法基于直播间长连接实现点对点通信,如图1所示,本实施例以该方法应用于服务器为例进行说明,具体包括如下步骤:

在步骤s110中,监听用户账户建立直播连接的连接消息。

其中,连接消息中包括用户账户的账户标识以及用户账户连接的直播进程。具体地,账户标识是用于识别账户身份的标志或记号,如用于唯一表示账户身份的id(identitydocument,如账户的身份证标识号、账号、唯一编码等)。建立直播连接则是指建立与直播服务器的连接,具体地,当用户账户登录直播应用程序或打开直播页面时,则表示用户账户与直播服务器建立连接关系。直播进程则是指用户账户建立与直播服务器的连接所拥有的系统资源,也即后端进程或实例,具体地,用户账户连接的直播进程可以是用户账户建立与直播服务器的连接时获得。在本实施例中,通过监听用户账户建立直播连接的连接消息,从而获取连接消息中用户账户的账户标识以及用户账户建立直播连接的直播进程。

在步骤s120中,获取待发送消息。

其中,待发送消息是指将要向已建立直播连接的用户账户发送的消息。具体地,待发送消息中携带有接收消息的目标账户的账户标识以及该目标账户所在的直播间标识,直播间标识则是用于区分直播间的标志或记号,如可以是用于唯一表示直播间的直播间id。通过直播间标识可以实现基于直播间维度对消息进行点对点处理。在本实施例中,通过获取向目标账户发送的待发送消息,进而采用后续步骤并基于直播间长连接实现对目标账户点对点的消息发送。

在步骤s130中,基于目标账户的账户标识以及目标账户所连接的直播进程,获取对应待发送消息的存储通道,将待发送消息存入对应的存储通道中。

其中,存储通道是用于存储待发送消息的中间存储空间。由于直播进程是用户账户建立与直播服务器的连接所拥有的系统资源,也即后端进程或实例,而单实例又有连接总数的限制,因此总的账户连接的数量会控制在一定范围内,但通常该数量也不会太小。因此,在本实施例中,为了避免并发消息数太多而导致消息发送延迟的问题,本实施例中通过存储通道的方式对同一实例处理的待发送消息进行分流,即基于目标账户的账户标识获取对应待发送消息的存储通道,进而将待发送消息存入对应的存储通道中。在本实施例中,待发送消息的存储通道可以通过计算得到,例如,若待发送消息中接收消息的目标账户的账户标识为u1,其与直播进程s1建立连接,则存在映射u1->s1,则根据u1可以计算其对应的存储通道,例如可以基于设定值对u1进行取模运算,而得到u1除以设定值的模,如u1除以设定值的模为3,则可以确定该待发送消息对应的存储通道为key_s1_3,因此,可以将该待发送消息存储到key_s1_3中。

在步骤s140中,基于直播间标识,通过固定线程将存储通道中存储的待发送消息发送给对应的目标账户。

在本实施例中,可以基于直播间标识,即以直播间维度,通过固定线程将存储通道中存储的待发送消息发送给对应的目标账户,从而实现基于单一的直播长连接完成点对点通信。又由于一个进程中可以并发多个线程,而多个线程可以并行执行不同的任务,因此,还可以为每个存储通道指定一个固定线程,进而可以通过存储通道对应的固定线程将存储通道中存储的待发送消息发送给对应的目标账户,从而加快点对点通信的处理速度。

上述消息发送方法,通过监听用户账户建立直播连接的连接消息,并获取向目标账户发送的待发送消息,基于目标账户的账户标识以及目标账户所连接的直播进程,获取对应待发送消息的存储通道,将待发送消息存入对应的存储通道中,并基于直播间标识,通过固定线程将存储通道中存储的待发送消息发送给对应的目标账户,从而实现基于单一的直播长连接完成点对点通信,不仅节省了基于app实现点对点通信的开发成本,且降低了基于app实现点对点通信的依赖及风险。

在一示例性实施例中,连接消息中还包括用户账户连接直播进程的连接时间;则获取待发送消息之前,上述方法还包括:记录用户账户连接的直播进程以及连接时间。其中,连接时间可以是用户账户连接直播进程的时间点。具体地,通过监听用户账户建立直播连接的连接消息,从而可以获取连接消息中用户账户连接直播进程的连接时间。并基于上述监听到的连接消息,记录从连接消息中获取的用户账户连接的直播进程以及连接时间。在本实施例中,用户账户所连接的直播进程可以是对应的进程标识,连接时间则可以是与该直播进程建立连接的连接时间点。例如,用户账户u1在时间点t1与直播进程s1建立连接,则存在映射u1->s1,则可以记录u1->(s1,t1),即表示用户账户u1在t1时刻(即连接时间)与s1(即直播进程)建立连接。

在本实施例中,通过记录用户账户连接的直播进程以及连接时间,从而在需要向用户账户发送点对点消息时,可以基于用户账户连接的直播进程快速确定消息接收的实例,以便于基于直播长连接实现点对点消息的传输。

在一示例性实施例中,如图2所示,在记录用户账户建立连接的直播进程以及连接时间之后,上述方法还包括如下步骤:

在步骤s210中,监听用户账户建立直播连接的心跳消息,基于心跳消息获取用户账户连接的当前直播进程以及当前连接时间。

通常,由于网络抖动或异常会导致原本建立连接的用户账户与直播进程之间断开连接,并在网络恢复正常时重新为用户账户分配直播进程,以使其建立连接。因此,在本实施例中,通过监听用户账户建立直播连接的心跳消息,并基于心跳消息获取用户账户连接的当前直播进程以及当前连接时间,从而对用户账户所在直播进程进行实时维护。其中,当前直播进程与当前连接时间是基于当前监听的心跳消息而得到,正常情况下,通过对每一次心跳消息的监听,都可以得到对应用户账户建立连接的直播进程与相应的连接时间。在本实施例中,可以基于时间为维度,将通过最近一次心跳消息监听得到的用户账户建立连接的直播进程确定为当前直播进程,相应的连接时间确定为当前连接时间,而在此之前的直播进程和连接时间则为历史数据。

在步骤s220中,在存储序列中记录用户账户连接的当前直播进程以及当前连接时间。

其中,存储序列是以时间为维度的有序列表。由于心跳消息通常具有周期性,因此,以心跳消息的先后顺序将对应监听到的用户账户连接的当前直播进程以及当前连接时间有序存入该存储序列中。举例来说,若用户账户u1在时间点t1与直播进程s1建立连接,则存在映射u1->s1,并记录u1->(s1,t1)。由于账户端网络抖动会导致重新连接直播进程,导致上述u1->s1的映射关系失效。且通过进一步监听账户的心跳消息,若监听到用户账户u1在当前时间点t2与直播进程s2建立连接,则对用户账户所在直播进程进行维护,即通过存储序列zset记录用户账户连接的当前直播进程以及当前连接时间,则有u1->zset(<s1,t1>,<s2,t2>),其中t2>t1,t1为历史连接时刻,t2则为当前连接时刻。由此可知,用户账户已由直播进程s1切换到s2,因此,此时应以s2作为处理向用户账户发送消息的进程。基于此,用户账户所在的直播进程为存储序列中时间最晚的且与当前连接时间对应的当前直播进程。

在上述实施例中,由于心跳消息具有周期性,若在预设时间段内未监听到用户账户建立直播连接的心跳消息,则表示该用户账户已离开直播间,即与直播服务器断开连接,因此可以不再对该用户账户推送消息,从而可以删除存储通道中与用户账户的账户标识对应的待发送消息。具体地,若监听心跳消息的周期为20秒,则预设时间段应至少冗余一个丢心跳的逻辑,例如可以设置预设时间段为45秒,则在45秒内未监听到用户账户建立直播连接的心跳消息,则可以不再对该用户账户推送消息,并删除存储通道中与用户账户的账户标识对应的待发送消息,从而避免消息冗余而影响消息发送的即时性。

在一示例性实施例中,如图3所示,在将待发送消息存入对应的存储通道中之后,上述方法还包括如下步骤:

在步骤s310中,将待发送消息记录在发送中队列。

其中,发送中队列是用于记录正在发送的消息的队列。由于目前直播连接通道并未实现和客户端消息的ack(acknowledgecharacter,即是确认字符)机制,因此,服务器无法感知消息是否已经发出。基于此,在本实施例中,在需要发送消息时,即在步骤s120中,将待发送消息存入对应的存储通道中,于此同时可以将该待发送消息记录在发送中队列,并启动相应的监听消息服务进行处理。

在步骤s320中,并在监听到通过固定线程将存储通道中存储的待发送消息发送给对应的目标账户时,从发送中队列中删除待发送消息。

具体地,当监听到通过固定线程将存储通道中存储的待发送消息发送给对应的目标账户时,则表示该待发送消息已发送,从而可以从发送中队列中删除该待发送消息。以实现可以感知消息是否发出的反馈机制,进而可以实现对消息到达率的统计等。

在一示例性实施例中,上述将待发送消息记录在发送中队列之后,所述方法还包括:在发送中队列中记录待发送消息的记录时间;周期性扫描记录在发送中队列中的待发送消息,若当前的扫描时间与记录待发送消息的记录时间之间的时间间隔超过第一设定阈值,则将待发送消息重新存入对应的存储通道中。若当前的扫描时间与记录待发送消息的记录时间之间的时间间隔超过第二设定阈值,则从发送中队列中删除待发送消息,其中,第二设定阈值大于第一设定阈值。具体地,上述将待发送消息记录在发送中队列时,同时记录待发送消息记录在发送中队列的记录时间,进而周期性扫描记录在发送中队列中的待发送消息,由于将待发送消息发送给对应的目标账户后,该待发送消息会从发送中队列中删除。因此,当该待发送消息在发送中队列中超过第一设定阈值还未被删除,则表示该待发送消息还未被发送给目标账户,因此,可以将该待发送消息重新存入对应的存储通道中,即对该待发送消息进行重发。而当该待发送消息在发送中队列中超过第二设定阈值还未被删除,由于直播过程中的消息具有一定的时效性,此时则表示该待发送消息已没有发送的必要,因此,可以从发送中队列中删除该待发送消息。

上述实施例中,通过在发送中队列中记录待发送消息的记录时间,并周期性扫描记录在发送中队列中的待发送消息,若当前的扫描时间与记录待发送消息的记录时间之间的时间间隔超过第一设定阈值,则将待发送消息重新存入对应的存储通道中,若当前的扫描时间与记录待发送消息的记录时间之间的时间间隔超过第二设定阈值,则从发送中队列中删除待发送消息,从而实现针对网络异常下的消息发送失败场景进行兜底处理,通过重发的方式提高了消息到达率。

应该理解的是,虽然图1-图3的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,图1-图4中的至少一部分步骤可以包括多个步骤或者多个阶段,这些步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤中的步骤或者阶段的至少一部分轮流或者交替地执行。

图4是根据一示例性实施例示出的一种消息发送装置框图。参照图4,该装置包括连接消息监听模块402,待发送消息获取模块404,存储模块406和消息发送模块408,其中:

连接消息监听模块402,被配置为执行监听用户账户建立直播连接的连接消息,所述连接消息中包括所述用户账户的账户标识以及所述用户账户连接的直播进程;

待发送消息获取模块404,被配置为执行获取待发送消息,所述待发送消息中携带有接收消息的目标账户的账户标识以及目标账户所在的直播间标识;

存储模块404,被配置为执行基于接收消息的目标账户的账户标识以及所述目标账户所连接的直播进程,获取对应待发送消息的存储通道,将所述待发送消息存入对应的存储通道中;

消息发送模块406,被配置为执行基于所述直播间标识,通过固定线程将所述存储通道中存储的所述待发送消息发送给对应的目标账户。

在一示例性实施例中,所述连接消息中还包括所述用户账户连接直播进程的连接时间;所述装置还包括:记录模块,被配置为执行记录所述用户账户连接的直播进程以及连接时间。

在一示例性实施例中,所述装置还包括:心跳消息监听模块,被配置为执行监听所述用户账户建立直播连接的心跳消息,基于所述心跳消息获取所述用户账户连接的当前直播进程以及当前连接时间;所述记录模块还被配置为执行在存储序列中记录所述用户账户连接的当前直播进程以及当前连接时间。

在一示例性实施例中,所述心跳消息监听模块还被配置为执行:若在预设时间段内未监听到所述用户账户建立直播连接的心跳消息,则删除存储通道中与所述用户账户的账户标识对应的待发送消息。

在一示例性实施例中,所述用户账户所在的直播进程为所述存储序列中时间最晚的与所述当前连接时间对应的当前直播进程。

在一示例性实施例中,所述装置还包括发送中队列记录模块,被配置为执行:将所述待发送消息记录在发送中队列;并在监听到通过固定线程将所述存储通道中存储的所述待发送消息发送给对应的目标账户时,从所述发送中队列中删除所述待发送消息。

在一示例性实施例中,所述发送中队列记录模块还被配置为执行:在所述发送中队列中记录所述待发送消息的记录时间;周期性扫描记录在所述发送中队列中的待发送消息,若当前的扫描时间与记录所述待发送消息的记录时间之间的时间间隔超过第一设定阈值,则将所述待发送消息重新存入所述存储通道中。

在一示例性实施例中,所述发送中队列记录模块还被配置为执行:若当前的扫描时间与记录所述待发送消息的记录时间之间的时间间隔超过第二设定阈值,则从所述发送中队列中删除所述待发送消息,所述第二设定阈值大于所述第一设定阈值。

关于上述实施例中的装置,其中各个模块执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。

图5是根据一示例性实施例示出的一种用于消息发送的设备s00的框图。例如,设备s00可以为一服务器。参照图5,设备s00包括处理组件s20,其进一步包括一个或多个处理器,以及由存储器s22所代表的存储器资源,用于存储可由处理组件s20的执行的指令,例如应用程序。存储器s22中存储的应用程序可以包括一个或一个以上的每一个对应于一组指令的模块。此外,处理组件s20被配置为执行指令,以执行上述消息发送的方法。

设备s00还可以包括一个电源组件s24被配置为执行设备s00的电源管理,一个有线或无线网络接口s26被配置为将设备s00连接到网络,和一个输入输出(i/o)接口s28。设备s00可以操作基于存储在存储器s22的操作系统,例如windowsserver,macosx,unix,linux,freebsd或类似。

在示例性实施例中,还提供了一种包括指令的计算机可读存储介质,例如包括指令的存储器s22,上述指令可由设备s00的处理器执行以完成上述方法。存储介质可以是计算机可读存储介质,例如,所述计算机可读存储介质可以是rom、随机存取存储器(ram)、cd-rom、磁带、软盘和光数据存储设备等。

在示例性实施例中,还提供一种计算机程序产品,包括计算机程序,所述计算机程序被处理器执行时实现上述的消息发送方法。

本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本公开的其它实施方案。本公开旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本公开的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本公开的真正范围和精神由下面的权利要求指出。

应当理解的是,本公开并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本公开的范围仅由所附的权利要求来限制。

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