发明内容
为了解决现有技术的问题,本发明实施例提供了一种虚拟礼品赠送方法及装置。所述技术方案如下:
第一方面,提供了一种消息推送方法,所述方法包括:
检测客户端是否兼容网络套接字Websocket协议;
若所述客户端兼容所述Websocket协议,则基于Websocket协议进行消息推送;
若所述客户端不兼容所述Websocket协议,则基于长轮询方式进行消息推送。
在第一方面的第一种可能的实施方式中,所述检测客户端是否兼容网络套接字Websocket协议,包括:
通过预定函数检测所述客户端是否兼容网络套接字Websocket协议;
其中,所述预定函数是所述Websocket协议所提供的函数。
在第二种可能的实施方式中,所述基于长轮询方式进行消息推送,包括:
接收所述客户端发送的第i轮询请求;
在不存在待推送的消息时,忽略所述第i轮询请求且保持与所述客户端之间的网络连接;
接收所述客户端发送的第i+1轮询请求;所述第i+1轮询请求是所述网络连接超时或断开时所述客户端重新发送的轮询请求,其中i为正整数。
在第三种可能的实施方式中,所述接收所述客户端发送的第i轮询请求之后,还包括:
在存在所述待推送的消息时,向所述客户端发送所述待推送的消息。
结合第一方面、第一方面的第一种可能的实施方式、第一方面的第二种可能的实施方式或者第一方面的第三种可能的实施方式,在第四种可能的实施方式中,所述若所述客户端兼容所述Websocket协议,则基于Websocket协议进行消息推送之后,还包括:
检测与所述客户端之间的网络连接在预设时间内的中断次数是否超过预设阈值;
若所述网络连接在预设时间内的中断次数超过所述预设阈值,则基于所述长轮询方式进行消息推送。
第二方面,提供了一种消息推送装置,所述装置包括:
检测模块,用于检测客户端是否兼容网络套接字Websocket协议;
第一推送模块,用于在所述检测模块检测结果为所述客户端兼容所述Websocket协议时,基于Websocket协议进行消息推送;
第二推送模块,用于在所述检测模块检测结果为所述客户端不兼容所述Websocket协议时,基于长轮询方式进行消息推送。
在第二方面的第一种可能的实施方式中,所述检测模块,还用于,通过预定函数检测所述客户端是否兼容网络套接字Websocket协议,其中,所述预定函数是所述Websocket协议所提供的函数。
在第二种可能的实施方式中,所述第二推送模块,包括:
第一接收单元,用于接收所述客户端发送的第i轮询请求;
连接保持单元,用于在不存在待推送的消息时,忽略所述第一接受单元接收的所述第i轮询请求且保持与所述客户端之间的网络连接;
第二接收单元,用于接收所述客户端发送的第i+1轮询请求;所述第i+1轮询请求是所述网络连接超时或断开时所述客户端重新发送的轮询请求,其中i为正整数。
在第三种可能的实施方式中,所述第二推送模块,还包括:
消息发送单元,用于所述第一接收单元接收所述客户端发送的第i轮询请求之后,在存在所述待推送的消息时,向所述客户端发送所述待推送的消息。
结合第二方面、第二方面的第一种可能的实施方式、第二方面的第二种可能的实施方式或者第二方面的第三种可能的实施方式,在第四种可能的实施方式中,所述第一推送模块,包括:
检测单元,用于检测与所述客户端之间的网络连接在预设时间内的中断次数是否超过预设阈值;
切换单元,用于在所述检测单元检测结果为所述网络连接在预设时间内的中断次数超过所述预设阈值时,切换至第一推送模块。
本发明实施例提供的技术方案带来的有益效果是:
通过检测客户端是否兼容网络套接字Websocket协议;通过检测客户端是否兼容Websocket协议;若客户端兼容Websocket协议,则基于Websocket协议进行消息推送;若客户端不兼容Websocket协议,则基于长轮询方式进行消息推送,使得客户端不必频繁地向服务器发出资源请求,就可以保持客户端和服务器端的同步,解决了当客户端以频繁请求的方式来保持客户端和服务器之间的同步时,占用大量服务器资源的问题,达到了根据客户端的实际情况选择使用更为合理的消息推送方式,降低服务器端CPU的利用率的效果。
此外,本发明实施例提供的消息推送方法,在基于Websocket协议进行消息推送时,通过检测与客户端之间的网络连接在预设时间内的中断次数是否超过预设阈值;若超过预设阈值,则基于长轮询方式进行消息推送,使得在客户端和服务器之间的网络连接环境较差时,客户端仍可以在尽量短的时间内接收到服务器的推送消息,达到了在客户端和服务器之间的网络连接环境较差时,提高客户端接收服务器的推送消息的实时性的效果。
进一步地,本发明实施例提供的消息推送方法,在基于长轮询方式进行消息推送时,客户端发送第i轮询请求后,通过服务器检测是否存在待推送的消息;在不存在待推送的消息时,忽略第i轮询请求且保持与客户端之间的网络连接;在存在待推送的消息时,向客户端发送待推送的消息;接收客户端发送的第i+1轮询请求,使得服务器在基于长轮询方式进行消息推送时,若服务器中没有待推送的消息,则不向客户端推送消息,解决了基于轮询方式进行消息推送时,若服务器中没有待推送的消息,重复向客户端发送旧的待推送消息的问题,达到了减少网络宽带的利用率,提高消息推送的准确性的效果。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本发明相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本发明的一些方面相一致的装置和方法的例子。
HTTP(HyperTextTransferProtocol,超文本传输协议)是互联网上应用最为广泛的一种网络协议。HTTP协议是一种单向的网络协议。在建立连接后,只有当客户端向服务器发出资源请求后,服务器才能返回相应的数据。而服务器不能主动的推送数据给客户端。
若客户端需要获取服务器的实时数据,就需要客户端与服务器之间反复进行HTTP通信。即,客户端不断发送资源请求,以实现服务器向客户端实时地进行消息推送。常用的消息推送方法如下:
轮询(Polling):
轮询方式的过程为:客户端定时地向服务器发送资源请求;服务器接收到资源请求后,把待推送的数据推送给客户端;客户端接收该待推送的数据。定期重复上述过程。
虽然轮询的方式实现了客户端与服务器之间的实时通讯,但是当服务器中没有待推送的数据推送给客户端时,该轮询的过程仍然进行,服务器会把推送过的数据再次进行推送,既浪费网络带宽,又浪费了服务器中CPU的利用率。
请参考图1,其示出了本发明一个实施例提供的消息推送方法的流程图,本实施例以该消息推送方法应用于服务器中来举例说明。该消息推送方法可以包括但不限于以下步骤:
步骤101,检测客户端是否兼容Websocket协议。
步骤102,若客户端兼容Websocket协议,则基于Websocket协议进行消息推送。
步骤103,若客户端不兼容Websocket协议,则基于长轮询方式进行消息推送。
综上所述,本发明实施例提供的消息推送方法,通过检测客户端是否兼容Websocket协议;若客户端兼容Websocket协议,则基于Websocket协议进行消息推送;若客户端不兼容Websocket协议,则基于长轮询方式进行消息推送,使得客户端不必频繁地向服务器发出资源请求,就可以保持客户端和服务器之间的同步,解决了当服务器基于轮询方式进行消息推送时,占用大量服务器资源的问题,达到了根据客户端的实际情况选择使用更为合理的消息推送方式,降低服务器端CPU的利用率的效果。
可选的,基于Websocket协议进行消息推送时,网络连接的建立至少需要一对网络套接字,其中一个运行于客户端,称为WSClient(WebsocketClient,网络套接字客户端),另一个运行于服务器端,称为WSServer(WebsocketServer,网络套接字服务器)。
基于Websocket协议进行消息推送时,除了要进行基于TCP协议的握手过程之外,还要进行WSClient与WSServer之间的握手过程。
请参考图2,其示出了本发明一个实施例提供的基于Websocket协议进行消息推送时网络连接建立过程的交互图,其中,客户端中包括基于Websocket协议的WSClient和基于TCP协议的TCPClient;服务器端中包括基于Websocket协议的WebsocketServer和基于TCP协议的TCPServer。该基于Websocket协议进行消息推送的网络连接建立步骤如下:
1)WSClient向TCPClient发送网络连接请求;
2)第一次握手:TCPClient收到该网络连接请求后,将SYN(synchronous,同步信号)包发送给TCPServer,并进入SYN_SEND状态,等待TCPServer确认;
3)第二次握手:TCPServer接收到SYN包后,将SYN包和ACK包(Acknowledgement,确认字符)返回给TCPClient,此时TCPServer进入SYN_RECV状态;
4)第三次握手:若TCPClient成功接收到该SYN和ACK包,则TCPClient将ACK确认包发送给TCPServer;
ACK确认包发送完毕,TCPClient和TCPServer进入ESTABLISHED状态,完成三次握手。
如果基于TCP协议的网络连接过程成功,那么客户端与服务器之间的网络连接建立。
如果基于TCP协议的网络连接过程失败,那么后面的过程就不会执行,客户端会收到错误消息的通知。
以下为客户端和服务器基于TCP协议成功建立连接后,WSClient与WSServer之间的握手过程:
5)WSClient通过HTTP协议向WSServer发送连接请求,该连接请求中包含WSServer中WebSocket协议的字版本号,原始地址,主机地址等;
本次连接请求,用于服务器端判断消息推送方法是基于WebSocket协议还是基于HTTP协议。
6)WSServer收到WSClient发来的连接请求后,若检测到数据包数据和格式正确、客户端和服务器端的协议版本号匹配,则WSServer接收本次连接请求,并将相应的数据包回复给WSClient;
其中,回复的数据包也是采用HTTP协议传输。
7)WSClient接收到WSServer回复的数据包后,如果数据包的内容和格式都正确,表示本次握手成功。
此后,服务器就可以基于WebSocket协议向客户端实时地进行消息推送。
可选的,基于长轮询方式进行消息推送的过程为:
1)基于TCP协议进行握手过程,建立客户端与服务器之间的网络连接;
具体的,该握手过程与上述基于Websocket协议进行消息推送时,基于TCP协议进行的握手过程一致,此处不再赘述。
2)客户端向服务器发送资源请求;
3)服务器中如果存在待推送数据,就把该数据推送给客户端,客户端收到该数据后,断开本次网络连接,并再次向服务器发送网络连接请求;
4)如果服务器不存在待推送数据,服务器保持连接,直到服务器接收到新的待推送数据时,再将该新的待推送数据发送给客户端;
5)如果服务器中的待推送数据长时间没有更新,客户端与服务器端的网络连接就会超时,网络连接断开,则客户端再次向服务器发送网络连接请求。也即,步骤1中建立网络连接时的网络连接请求。
循环上述过程。
请参考图3,其示出了本发明一个实施例提供的消息推送方法的流程图,本实施例以该消息推送方法应用于服务器中来举例说明,该消息推送方法可以包括但不限于以下步骤:
步骤301,检测客户端是否兼容Websocket协议。
由于Websocket协议是一种新型协议,并非所有客户端都兼容Websocket协议。因此,在客户端与服务器之间建立网络连接后,若客户端向服务器发送了资源请求,服务器接收到该资源请求后,需要对该客户端是否兼容Websocket协议进行检测。
服务器检测客户端是否兼容Websocket协议的方法为:通过预定函数检测客户端是否兼容Websocket协议。
其中,预定函数是Websocket协议所提供的函数。
在Websocket协议中,包含一个预定函数,该预定函数用于检测当前发出资源请求的客户端,是否兼容Websocket协议。
在客户端与服务器之间的网络连接建立后,客户端向服务器发送的资源请求中包含一个头信息,若服务器通过预设函数检测到该头信息中包含预定字段,则服务器判断为当前客户端兼容Websocket协议。此后,服务器基于Websocket协议向客户端进行消息推送,执行步骤302。
若服务器在头文件中没有检测到该预定字段,则服务器判断为当前客户端不兼容Websocket协议。由于所有类型的浏览器都对HTTP协议兼容,而长轮询方式是服务器基于HTTP协议向客户端推送消息,且相对于传统的轮询方式占用的服务器资源较少,因此,服务器基于长轮询方式进行消息推送,来保证客户端的浏览功能正常使用,执行步骤304。
步骤302,基于Websocket协议向客户端进行消息推送。
步骤303,检测与客户端之间的网络连接在预设时间内的中断次数是否超过预设阈值。
服务器每隔预定时间间隔,检测与客户端之间的网络连接在预设时间内的终端次数是否超过预设阈值。
若服务器在每个预定时间间隔的检测结果为与客户端之间的网络连接,在预设时间内的中断次数未超过预设阈值,则认为当前的网络环境较好,继续基于Websocket协议进行消息推送,执行步骤302。
若服务器在每个预定时间间隔的检测结果为与客户端之间的网络连接,在预设时间内的中断次数超过预设阈值,则认为当前的网络环境差,此时,服务器转基于长轮询方式进行消息推送,执行步骤304。
其中,预定时间间隔、预设时间和预设阈值为开发者自行设置的数值,本实施例不做限定。如:预定时间间隔为2分钟,预设时间为5分钟,预设阈值为2次,即,服务器每隔2分钟,检测与客户端之间的网络连接在5分钟内的中断次数是否超过2次;或者预定时间间隔为1分钟,预设时间为10分钟,预设阈值为3次,即,服务器每隔1分钟,检测与客户端之间的网络连接在10分钟内的中断次数是否超过3次。
由于,服务器在基于Websocket协议向客户端进行消息推送时,分为两个过程:连接建立过程和数据传输过程。连接建立过程又分为基于TCP协议的握手过程和WSClient与WSServer之间的握手过程。
其中,基于TCP协议的握手过程是基于Websocket协议进行消息推送和基于长轮询方式进行消息推送都需要进行的过程,而WSClient与WSServer之间的握手过程仅在基于Websocket协议进行消息推送时,才会发生。
因此,基于Websocket协议进行消息推送的连接建立过程,比基于长轮询方式进行消息推送的连接建立过程要多进行一次握手。由此可知,基于Websocket协议进行消息推送的连接建立时间要多于基于长轮询方式进行消息推送的连接建立时间。
因此,当网络连接多次断开时,基于Websocket协议进行消息推送要耗费大量的时间在建立连接上。为了提高客户端接收服务器的推送消息的实时性,当在一定时间内网络连接多次断开时,服务器选择基于长轮询方式向客户端进行消息推送。
步骤304,基于长轮询方式向客户端进行消息推送。
步骤305,接收客户端发送的第i轮询请求,其中i为正整数。
服务器的判断结果为基于长轮询方式向客户端进行消息推送后,接收客户端发送的第i轮询请求。
其中,第i轮询请求是客户端向服务器发送的资源请求,服务器根据该第i轮询请求作出响应。
在服务器中存在待推送的消息时,执行步骤306;在服务器中不存在待推送的消息时,执行步骤307。
步骤306,在存在待推送的消息时,向客户端发送待推送的消息。
服务器和客户端之间的网络连接存在一个时间阈值,在该时间阈值内,始终保持网络连接。服务器接收到客户端的第一轮询请求后,若在时间阈值内,服务器检测结果为存在对应的客户端的待推送消息,则将该消息推送给客户端。
客户端接收到服务器的推送消息后,服务器断开与客户端之间的网络连接。
本步骤中,时间阈值可由开发者设置,本实施例不做限定,比如时间阈值为1分钟。
客户端接收到服务器的推送消息后,服务器断开与客户端之间的网络连接。
步骤307,在不存在待推送的消息时,忽略第i轮询请求且保持与客户端之间的网络连接。
在客户端发送第i轮询请求后,服务器定时检测是否存在对应的客户端的待推送的消息,如:服务器每隔0.1秒检测是否存在对应的客户端的待推送的消息。在服务器检测结果为不存在对应的客户端的待推送的消息时,不向客户端推送消息,并且保持客户端和服务器之间的网络连接,也即,忽略第i轮询请求且保持与客户端之间的网络连接。
步骤308,接收客户端发送的第i+1轮询请求。
其中,该第i+1轮询请求是网络连接超时或断开时客户端重新发送的资源请求。
若在时间阈值内不存在待推送的消息,则客户端和服务器之间的网络连接自动断开,即网络连接超时。客户端接收到服务器发送的网络超时信息后,向服务器发送第i+1轮询请求。
若在时间阈值内存在待推送的消息,服务器将待推送的消息推送给客户端后,服务器与客户端之间的网络连接断开。客户端接收到服务器推送的消息后,向服务器发送第i+1轮询请求。
在上述两种情况下,通过客户端向服务器发送第i+1轮询请求,使得客户端与服务器之间的连接近似于一直存在,实现了“伪长链”。
服务器接收客户端发送的第i+1轮询请求,执行步骤304。
综上所述,本发明实施例提供的消息推送方法,通过检测客户端是否兼容Websocket协议;若客户端兼容Websocket协议,则基于Websocket协议进行消息推送;若客户端不兼容Websocket协议,则基于长轮询方式进行消息推送,使得客户端不必频繁地向服务器发出资源请求,就可以保持客户端和服务器端的同步,解决了当客户端以频繁请求的方式来保持客户端和服务器之间的同步时,占用大量服务器资源的问题,达到了根据客户端的实际情况选择使用更为合理的消息推送方式,降低服务器端CPU的利用率的效果。
此外,本发明实施例提供的消息推送方法,在基于Websocket协议进行消息推送时,通过检测与客户端之间的网络连接在预设时间内的中断次数是否超过预设阈值;若超过预设阈值,则基于长轮询方式进行消息推送,使得在客户端和服务器之间的网络连接环境较差时,客户端仍可以在尽量短的时间内接收到服务器的推送消息,达到了在客户端和服务器之间的网络连接环境较差时,提高客户端接收服务器的推送消息的实时性的效果。
进一步地,本发明实施例提供的消息推送方法,在基于长轮询方式进行消息推送时,客户端发送第i轮询请求后,通过服务器检测是否存在待推送的消息;在不存在待推送的消息时,忽略第i轮询请求且保持与客户端之间的网络连接;在存在待推送的消息时,向客户端发送待推送的消息;接收客户端发送的第i+1轮询请求,使得服务器在基于长轮询方式进行消息推送时,若服务器中没有待推送的消息,则不向客户端推送消息,解决了基于轮询方式进行消息推送时,若服务器中没有待推送的消息,重复向客户端发送旧的待推送消息的问题,达到了减少网络宽带的利用率,提高消息推送的准确性的效果。
请参考图4,其示出了本发明一个实施例提供的消息推送装置的框图,本实施例以该消息推送装置应用于服务器中来举例说明,该消息推送装置可以包括但不限于以下模块:检测模块410、第一推送模块420、第二推送模块430。
该检测模块410,用于检测客户端是否兼容网络套接字Websocket协议;
该第一推送模块420,用于在检测模块410检测结果为客户端兼容Websocket协议时,基于Websocket协议进行消息推送;
该第二推送模块430,用于在检测模块410检测结果为客户端不兼容Websocket协议时,则基于长轮询方式进行消息推送。
综上所述,本发明实施例提供的消息推送装置,通过检测客户端是否兼容Websocket协议;若客户端兼容Websocket协议,则基于Websocket协议进行消息推送;若客户端不兼容Websocket协议,则基于长轮询方式进行消息推送,使得客户端不必频繁地向服务器发出资源请求,就可以保持客户端和服务器端的同步,解决了当客户端以频繁请求的方式来保持客户端和服务器之间的同步时,占用大量服务器资源的问题,达到了根据客户端的实际情况选择使用更为合理的消息推送方式,降低服务器端CPU的利用率的效果。
请参考图5,其示出了本发明一个实施例提供的消息推送装置的框图,本实施例以该消息推送装置应用于服务器中来举例说明,该消息推送装置可以包括但不限于以下模块:检测模块510、第一推送模块520、第二推送模块530。
该检测模块510,用于检测客户端是否兼容网络套接字Websocket协议;
该第一推送模块520,用于在检测模块510检测结果为客户端兼容Websocket协议时,基于Websocket协议进行消息推送;
该第二推送模块530,用于在检测模块510检测结果为客户端不兼容Websocket协议时,则基于长轮询方式进行消息推送。
可选的,该检测模块510,还用于,通过预定函数检测客户端是否兼容网络套接字Websocket协议,其中,该预定函数是Websocket协议所提供的函数。
可选的,该第二推送模块530,包括:第一接收单元531、连接保持单元532、第二接收单元533。
该第一接收单元531,用于接收客户端发送的第i轮询请求;
该连接保持单元532,用于在不存在待推送的消息时,忽略第一接受单元531接收的第i轮询请求且保持与客户端之间的网络连接;
该第二接收单元533,用于接收客户端发送的第i+1轮询请求;第i+1轮询请求是网络连接超时或断开时客户端重新发送的轮询请求,其中i为正整数。
可选的,第二推送模块530,还包括:消息发送单元534。
该消息发送单元534,用于第一接收单元531接收客户端发送的第i轮询请求之后,在存在待推送的消息时,向客户端发送待推送的消息。
可选的,第一推送模块520,包括:检测单元521、切换单元522。
该检测单元521,用于检测与客户端之间的网络连接在预设时间内的中断次数是否超过预设阈值;
该切换单元522,用于在网络连接在检测单元521检测结果为预设时间内的中断次数超过预设阈值时,切换至第一推送模块。
综上所述,本发明实施例提供的消息推送装置,通过检测客户端是否兼容Websocket协议;若客户端兼容Websocket协议,则基于Websocket协议进行消息推送;若客户端不兼容Websocket协议,则基于长轮询方式进行消息推送,使得客户端不必频繁地向服务器发出资源请求,就可以保持客户端和服务器端的同步,解决了当客户端以频繁请求的方式来保持客户端和服务器之间的同步时,占用大量服务器资源的问题,达到了根据客户端的实际情况选择使用更为合理的消息推送方式,降低服务器端CPU的利用率的效果。
此外,本发明实施例提供的消息推送方法,在基于Websocket协议进行消息推送时,通过检测与客户端之间的网络连接在预设时间内的中断次数是否超过预设阈值;若超过预设阈值,则基于长轮询方式进行消息推送,使得在客户端和服务器之间的网络连接环境较差时,客户端仍可以在尽量短的时间内接收到服务器的推送消息,达到了在客户端和服务器之间的网络连接环境较差时,提高客户端接收服务器的推送消息的实时性的效果。
进一步地,本发明实施例提供的消息推送方法,在基于长轮询方式进行消息推送时,客户端发送第i轮询请求后,通过服务器检测是否存在待推送的消息;在不存在待推送的消息时,忽略第i轮询请求且保持与客户端之间的网络连接;在存在待推送的消息时,向客户端发送待推送的消息;接收客户端发送的第i+1轮询请求,使得服务器在基于长轮询方式进行消息推送时,若服务器中没有待推送的消息,则不向客户端推送消息,解决了基于轮询方式进行消息推送时,若服务器中没有待推送的消息,重复向客户端发送旧的待推送消息的问题,达到了减少网络宽带的利用率,提高消息推送的准确性的效果。
需要说明的是:上述实施例提供的消息推送的装置在消息推送时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将设备的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的消息推送的装置与消息推送的方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。