和客户端进行通信的方法以及服务器的制造方法_2

文档序号:9581720阅读:来源:国知局
中的客户端标识W及应用标识。
[0037] 接下来,在步骤S120中,服务器需要查找预先存储的客户端信息列表,确定该 客户端信息列表中是否存储了与步骤SllO中获取的客户端标识相对应的长连接通道标 识。如果客户端信息列表中存储了与该客户端标识相对应的长连接通道标识,则执行步骤 S130,在步骤S130中,向该客户端返回用于指示长连接已建立的第一响应消息。如果客户 端信息列表中未存储与该客户端标识相对应的长连接通道标识,则执行步骤S140,在步骤 S140中,为该客户端分配一个长连接通道,并将分配的该长连接通道的长连接通道标识W 及该客户端标识对应存入该客户端信息列表中,并向该客户端返回用于指示长连接未建立 的第二响应消息。其中,第二响应消息中包含该长连接通道标识,用于指示客户端根据该长 连接通道标识与服务器建立长连接。
[0038] 应当注意的是,在本技术方案中,并不是服务器发起与客户端建立长连接,而是服 务器设置好客户端要建立长连接所需要的配置内容,将运些内容返回给客户端,并由客户 端根据运些配置内容主动发起与服务器建立长连接。对于基于诸如HTTP协议之类的无状 态连接的应用(诸如基于网页的应用)而言,由于客户端和服务器之间的连接本身就处于 无状态连接方式,运种长连接的建立方式更有利于客户端本身来控制长连接。
[0039] 在步骤S120至步骤S140的执行过程中,需要存储并维护一份客户端信息列表,然 后根据该客户端信息列表来判断发送请求消息的客户端与服务器之间是否已经建立了长 连接,并根据判断结果执行相应的处理。
[0040] 具体地,每当服务器接收到一个客户端发送的一次请求消息后,先要查找客户端 信息列表中是否存储有该客户端的客户端标识,如果没有,在该客户端信息列表中添加该 客户端的客户端标识,在该客户端信息列表中存储了该客户端的客户端标识的前提下,进 一步判断该客户端信息列表中是否存储了与该客户端标识相对应的长连接通道标识,如果 存储了与该客户端标识相对应的长连接通道标识,说明该客户端与服务器之间已经建立了 长连接,因此,直接向客户端返回用于指示长连接已经建立的第一响应消息。如果该客户端 信息列表中还没有存储与该客户端标识相对应的长连接通道标识,说明该客户端与服务器 之间没有建立长连接,因此,需要先为该客户端分配一个长连接通道,并将分配的长连接通 道的长连接通道标识W及该客户端标识对应存储在该客户端信息列表中。
[0041] 客户端信息列表中的长连接通道标识是通过如下方式存储的:每次新添加一个 客户端标识时,服务器为该新添加的客户端标识分配一个长连接通道标识,并将该长连接 通道标识与该客户端标识对应存储在客户端信息列表中,因此,当客户端信息列表中没有 存储请求消息中的客户端标识时,必然也没有存储与该客户端标识相对应的长连接通道标 识,运时,需要服务器执行步骤S140,为该客户端分配一个长连接通道,并向客户端返回包 含该长连接通道的长连接通道标识的第二响应消息,W指示客户端建立长连接。服务器为 客户端分配长连接通道之后,会将该长连接通道及其通道标识添加到客户端信息列表中, 因此,当在后续过程中服务器再次接收到该客户端发送的请求消息时,则会发现在客户端 信息列表中已经存储了该客户端的长连接通道标识,运时,服务器执行步骤S130,无需修改 客户端信息列表,只需向客户端返回用于指示长连接已建立的第一响应消息即可。
[0042] 具体地,服务器在判断该客户端信息列表中是否存储了该客户端的客户端标识对 应的长连接通道标识时,可W采用如下代码实现:
[0044] 由此可见,服务器通过sub_cnt参数的值来确定长连接是否存在,如果sub_cnt参 数值为1表示长连接已经存在,客户端无需建立长连接,因此向客户端返回第一响应消息; 如果sub_cnt参数值为0表示长连接还不存在,客户端应该立即建立长连接,因此向客户端 返回第二响应消息。相应地,客户端如果接收到第一响应消息,则无需执行任何操作;如果 接收到第二响应消息,则会根据第二响应消息中包含的长连接通道标识来与服务器建立长 连接。
[0045] 例如,在客户端收到第二响应消息之后,W上面基于网页的网络游戏为例,可W利 用下面的javacript脚本来与服务器建立长连接:
[0046]
[0047] 从服务器端返回的数据data.comet_url中就存储有长连接通道标识,因此,通过 U8.conn,init('js'),就可W根据长连接通道标识来和服务器建立长连接。
[0048] 下面详细介绍一下客户端信息列表中存储的数据内容及存储格式。客户端信息列 表中需要存储=类数据。为了提高运行效率,运=类数据可W采用redis存储系统进行存 储,redis存储系统采用内存式存储,因此运行效率较高。
[0049] 第一类数据是在线用户列表,在该类数据中主要存储当前在线的客户端的客户端 标识,可W采用Zset数据结构存储。Zset是一种带权重的set结构,可W将叩沈RIONLI肥" 作为set的键,客户端标识(即用户id)作为值,用户上线时间作为权重,存储时间权重的 目的主要是为了方便删除已下线的用户,从而尽量保证在线用户列表中存储的用户都为在 线用户,具体删除的方法将在后面介绍。为了对第一类数据进行维护,每当服务器接收到客 户端发送的请求消息后,都要判断在客户端信息列表中是否存储有该请求消息中包含的客 户端标识(即用户id),当不包含该客户端标识时,在客户端信息列表的在线用户列表中增 加一项存储条目,在该项存储条目中Wzset数据结构存储该客户端标识W及该请求消息 的发送时间,具体地,将"US邸IONLI肥"作为运一存储条目的键,该客户端标识作为运一条 目的值,并通过请求消息的发送时间来计算用户的上线时间,并将计算结果作为权重,由于 客户端信息列表原本不包含该客户端标识,所W运是服务器第一次接收到该客户端发送的 请求消息,因此,服务器记录下该次请求消息的时间,并计算用户上线时间为0。该客户端上 线后会每隔4分钟发送一次请求消息,因此,当服务器W后再接收到该客户端发来的请求 消息时,会发现客户端信息列表中已经存储了该客户端标识的存储条目,因此,只需根据本 次接收到请求消息的时间,对该存储条目中的权重值进行更新即可,具体更新时,假设服务 器是第N次接收到该客户端发送的请求消息,则计算第N次接收到请求消息的时间与第一 次接收到请求消息的时间间隔作为该用户的上线时间。
[0050] 第二类数据是每个在线用户对应的长连接通道,在该类数据中主要存储当前在线 用户使用的客户端与服务器通信时所采用的长连接通道,也可W采用Zset数据结构存储。 可W将"CHAN肥L_LIST|a山"作为set的键,"a山I{时间戳}"作为值,另外,还可W将用 户上线时间作为权重。其中,a山表示用户id,即第一类数据中的客户端标识,通过客户 端标识将第一类数据与第二类数据对应地关联起来。其中,第二类数据中的每个长连接通 道是由服务器为对应的客户端分配的。也就是说,每当服务器第一次接收到一个客户端发 来的请求消息时,不仅要在在线用户列表中增加一条存储条目,用来存储该客户端标识,而 且,由于该新增的客户端标识还没有对应的长连接通道,因此,服务器还会为该客户端标识 对应分配一个长连接通道,并将该长连接通道作为第二类数据存储在客户端信息列表中, 同时向客户端发送上述的第二响应消息。
[0051] 第S类数据是每个长连接通道的ip地址,采用键-值方式存储,键为"CHANWL_ POSI{用户id}I{通道标示}",值为长连接通道的ip地址,运个地址也就是服务器向客户 端传输消息时的消息传输地址。其中,每个长连接通道的ip地址通过"用户id"与第二类 数据中的长连接通道W及第一类数据中的客户端标识相关联。实际上,第=类数据中存储 的长连接通道的ip地址就是第二类数据中存储的长连接通道的通道地址。也就是说,第二 类数据仅仅存储了一个长连接通道的标号,而该标号对应的长连接通道的具体通道地址在 第=类数据中存储。因此,服务器每次在第二类数据中新增一个长连接通道时,还要对应地 在第=类数据中存储该长连接通道的通道地址,也就是长连接通道标识。
[0052] 上述的=类数据主要存储了客户端的客户端标识(第一类数据)W及客户端的长 连接通道标识(第=类数据),第二类数据将第一类数据和第=类数据更好地关联起来。具 体实现时,也可W采用其它的存储方式,只要能够关联存储客户端的信息W及长连接通道 的信息即可。
[0053] 另外,为了实现对上述=类数据的有效维护,除了通过上述方式在每次接收到请 求消息时判断该请求消息中包含的客户端标识是否已经存储在了客户端信息列表中,并在 判断结果为否时,将该客户端标识添加到客户端信息列表中,并为该客户端标识分配一个 长连接通道之外,还需要及时删除已经下线的客户端对应的客户端标识及其长连接通道。 上面已经提到,上线的客户端是每隔4分钟向服务器发送一次请求消息,W便服务器知道 客户端的在线状态。服务器每次收到请求消息后会记录下同一客户端每次发送请求消息的 时间,与此同时,服务器运行一个进程,该进程每隔6分钟扫描一次客户端信息列表中存储 的在线用户列表,将在6分钟之内没有发起请求消息的客户端对应的客户端标识W及相关 联的长连接通道及长连接通道标识删除,从而实现及时删除下线用户的目的,同时断开相 应的长连接通道。其中,本实施例
当前第2页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1