——蔡剑彬 C++服务器开发工程师 ([email protected])
合服技术的核心,就是将几个服的数据库合并,是十分简单的。但具体要注意的细节也是很重要的,比如如何从两个服务器入口进入到同个服务器?如何区分同一账号在两个服创建的角色?下面就按照玩游戏的流程来解决这些问题。
首先打开客户端时,有选服的功能,这个其实是让客户端选择要连接的服务器的IP地址和端口号。点击“进入游戏”时,就会通过socket连接,建立客户端和服务器的连接,此时服务器和客户端便可以通信了。基于这个原理,在合服的时候,将原本的服务器入口信息修改为同一个服务器的IP和端口号,就能够通过这两个入口进入同个服务器。
比如,现有1服(192.168.1.100, 8888)和2服(192.168.1.101, 8888),通过这两个入口,原本是可以进入两个不同的服务器。但是现在由于玩家少了,需要将两个服合起来,那么就需要这两个端口进入同个服务器。新开启的服务器的IP是192.168.1.102,那么将1服和2服的IP改为192.168.1.102后,玩家无论是通过哪个入口,都是和192.168.1.102服务器通信。
然后,进入游戏后,需要账号密码进行登录。这个验证动作,需要去数据库中寻找相应的数据,如果匹配则让其登录,否则不予通过。那么就需要将两个服的数据库整合在一起,整合很简单,用INSERT语句就可以了,或者通过可视化操作数据库软件也行。但这里有个问题,数据库中的主键会不会重叠呢?这里就涉及到了服务器设计时,一个比较重要的地方,就是服务器ID。服务器之间的区别就通过这个ID来区分。地址和端口号都无法区分各个服务器,仅仅只是能够确定服务器的位置,可以随意该。而服务器ID就不一样,每个服务器都有自己的一个特有ID,数据库的各个主键要和这个ID挂钩,那么在整合数据库的时候就不必担心主键是否会重叠了。
另外,要实现这个合服技术,还需要在数据库中设计一个表(gameserveraddress),用于存储其他服务器的信息(ID,IP,PORTNUM)。因为在玩家登陆的时候,会去解析该账号,最终得出整个账号对应的ActorID的服务器ID是否是本服务器,如果不是,则去gameserveraddress表中获取允许接入的服务器信息(这些信息在服务器初始化时已加载到内存)。这个是可拓展设计,能使合服变得十分轻松。
最后验证通过了,则根据账号对应的服务器ID,将原本服务器上面的角色信息返回给客户端。这样就能够解决在合服前,分别用同一账号在两个服注册了,合服后不会出现角色混乱的问题。