--- sidebarDepth: 1 --- # 8-服务器通信 ### 通信接口图示 通信接口图示如下 细箭头为单点消息,粗箭头为广播消息 #### 客户端通信接口 发往客户端消息的接口如下 ![transaction_client](../images/transaction_client.png) #### lobby/game通信接口 发往lobby/game消息的接口如下 ![transaction_game](../images/transaction_game.png) #### 控制服通信接口 发往控制服消息的接口如下 ![transaction_master](../images/transaction_master.png) #### 功能服通信接口 发往功能服消息的接口如下 ![transaction_service](../images/transaction_service.png) #### 功能服RPC调用流程 1. **功能服**调用`RegisterRpcMethodForMod`注册RPC调用,设置回调函数为`ServiceCallback` 2. **控制服/lobby/game**调用`RequestToServiceMod`触发RPC调用,同时设置回调函数为`ServerCallback` 3. **功能服**执行`ServiceCallback` 4. **功能服**发送响应消息到**控制服/lobby/game** 5. **控制服/lobby/game**执行回调`ServerCallback` 流程如下 ![tranasaction_rpc](../images/tranasaction_rpc.png) Apollo通信相关api。 ### client和game/lobby通信 #### NotifyToClient - 描述 game/lobby接口,game/lobby发送事件到指定客户端 - 参数 | 参数名 | 数据类型 | 说明 | | :--- | :--- | :--- | | targetId | str | 玩家playerId | | eventName | str | 事件名 | | eventData | dict | 事件参数 | - 返回值 无 - 示例 ```python #服务端给客户端发送消息的示例 #client mod class testClient(ClientSystem): def __init__(self,namespace,systemName): ClientSystem.__init__(self, namespace, systemName) self.ListenForEvent('serverNamespace', 'serverSystem', 'PlayerJoinOKEvent', self, self.OnPlayerJoinOK) def OnPlayerJoinOK(self, args): #args的结果为:{'uid':123, 'name':'nickname'} print 'OnPlayerJoinOK', args #game/lobby mod class testServer(ServerSystem): def __init__(self, namespace, systemName): ServerSystem.__init__(self, namespace, systemName) def testNotifyClient(self): player = {} player['uid'] = 123 player['name'] = 'nickname' playerId = '456' self.NotifyToClient(playerId, "PlayerJoinOKEvent", player) ``` #### NotifyToServer - 描述 客户端接口,给lobby/game服务器发送事件。注意,玩家只能存在于一个game或lobby,不可能同时存在于两个服务器 - 参数 | 参数名 | 数据类型 | 说明 | | :--- | :--- | :--- | | eventName | str | 事件名 | | eventData | dict | 事件参数 | - 返回值 无 - 示例 ```python #客户端给服务端发送消息的示例 #client mod class testClient(ClientSystem): def __init__(self,namespace,systemName): ClientSystem.__init__(self, namespace, systemName) def testNotifyServer(self): player = {} player['uid'] = 123 player['name'] = 'nickname' self.NotifyToServer("PlayerJoinEvent", data) #game/lobby mod class testServer(ServerSystem): def __init__(self, namespace, systemName): ServerSystem.__init__(self, namespace, systemName) self.ListenForEvent('clientNamespace', 'clientSystem', 'PlayerJoinEvent', self, self.OnPlayerJoin) def OnPlayerJoin(self, args): #args结果为:{'uid':123, 'name':'nickname'} print 'OnPlayerJoin', args ``` Apollo通信相关api。 ### master和game/lobby通信 #### NotifyToMaster - 描述 lobby/game接口,lobby/game给master发事件。 - 参数 | 参数名 | 数据类型 | 说明 | | :--- | :--- | :--- | | eventName | str | 事件名 | | eventData | dict | 事件参数 | - 返回值 无 - 示例 ```python #服务器给master发消息的示例 #master mod class testMaster(MasterSystem): def __init__(self,namespace,systemName): MasterSystem.__init__(self, namespace, systemName) self.ListenForEvent('lobbyNamespace', 'lobbySystem', 'PlayerJoinOKEvent', self, self.OnPlayerJoinOK) def OnPlayerJoinOK(self, args): #args的结果为:{'uid':123, 'name':'nickname'} print 'OnPlayerJoinOK', args #lobby mod class lobbyServer(ServerSystem): def __init__(self, namespace, systemName): ServerSystem.__init__(self, namespace, systemName) def testNotifyMaster(self, args): player = {} player['uid'] = 123 player['name'] = 'nickname' self.NotifyToMaster("PlayerJoinOKEvent", player) ``` #### NotifyToServerNode - 描述 master接口,master给某个lobby/game发事件 - 参数 | 参数名 | 数据类型 | 说明 | | :--- | :--- | :--- | | targetId | int | lobby/game的服务器id | | eventName | str | 事件名 | | eventData | dict | 事件参数 | - 返回值 无 - 示例 ```python #master给某个服务器发消息的示例 #master mod class testMaster(MasterSystem): def __init__(self,namespace,systemName): MasterSystem.__init__(self, namespace, systemName) def testNotifyServer(self): player = {} player['uid'] = 123 player['name'] = 'nickname' self.NotifyToServerNode(4000, "PlayerJoinEvent", data) #lobby mod,服务器id为4000 class lobbyServer(ServerSystem): def __init__(self, namespace, systemName): ServerSystem.__init__(self, namespace, systemName) self.ListenForEvent('masterNamespace', 'masterSystem', 'PlayerJoinEvent', self, self.OnPlayerJoin) def OnPlayerJoin(self, args): #args的结果为:{'uid':123, 'name':'nickname'} print 'OnPlayerJoin', args ``` Apollo通信相关api。 ### service和master通信 #### BroadcastToService - 描述 master接口,master给所有service广播消息。 - 参数 | 参数名 | 数据类型 | 说明 | | :--- | :--- | :--- | | eventName | str | 事件名 | | eventData | dict | 事件参数 | - 返回值 无 - 示例 ```python #master给所有service广播消息。 #service mod class ServiceApiSys(ServiceSystem): def __init__(self,namespace,systemName): ServiceSystem.__init__(self, namespace, systemName) self.ListenForEvent("NeteaseExtraApi", "extraApiMaster", "MasterBroadcastEvent", self, self.OnMasterBroadcastEvent) def OnMasterBroadcastEvent(self, args): print "OnMasterBroadcastEvent", args #master mod class masterServer(MasterSystem): def __init__(self, namespace, systemName): MasterSystem.__init__(self, namespace, systemName) masterHttp.RegisterMasterHttp("/api/service-broadcast-event", self, self.OnServiceBroadcastEvent) def OnServiceBroadcastEvent(self, clientId, requestBody): reqData = json.loads(requestBody) self.BroadcastToService("MasterBroadcastEvent", reqData) responseBody = json.dumps({ 'code': 0, 'message': "success", 'entity': {}, }) masterHttp.SendHttpResponse(clientId, responseBody) ``` #### NotifyToServiceNode - 描述 master接口,master给某个service发消息。 - 参数 | 参数名 | 数据类型 | 说明 | | :--- | :--- | :--- | | targetId | int | service的服务器id | | eventName | str | 事件名 | | eventData | dict | 事件参数 | - 返回值 无 - 示例 ```python #master给某个service发消息。 #service mod class ServiceApiSys(ServiceSystem): def __init__(self,namespace,systemName): ServiceSystem.__init__(self, namespace, systemName) self.ListenForEvent("NeteaseExtraApi", "extraApiMaster", "MasterEvent", self, self.OnMasterEvent) def OnMasterEvent(self, args): print "OnMasterEvent", args #master mod class masterServer(MasterSystem): def __init__(self, namespace, systemName): MasterSystem.__init__(self, namespace, systemName) masterHttp.RegisterMasterHttp("/api/service-event", self, self.OnServiceEvent) def OnServiceEvent(self, clientId, requestBody): reqData = json.loads(requestBody) self.NotifyToServiceNode(8000, "MasterEvent", reqData) responseBody = json.dumps({ 'code': 0, 'message': "success", 'entity': {}, }) masterHttp.SendHttpResponse(clientId, responseBody) ``` ### service和service/master通信 #### RegisterRpcMethod - 描述 service/master接口,用于监听service/master发过来请求,通常用于官方插件开发,服主请使用[RegisterRpcMethodForMod](#RegisterRpcMethodForMod)。要求:MCStudio打开配置文件目录,打开deploy.json文件,然后给service配置module_names信息 - 参数 | 参数名 | 数据类型 | 说明 | | :--- | :--- | :--- | | module | str | service/master所属模块,deploy.json文件中module_names中某个module | | event | str | 事件名 | | func | function | 监听函数 | - 返回值 无 - 示例 ```python #service同master通信示例.service同service通信与此类似,这里不重复了 #service mod class testService(ServiceSystem): def __init__(self,namespace,systemName): ServiceSystem.__init__(self, namespace, systemName) #注册service方法,注意一个事件只能注册一次,否则后面监听函数会覆盖前面监听函数 self.RegisterRpcMethod('idv_service','PlayerJoinOKEvent', self.OnPlayerJoinOK) def OnPlayerJoinOK(self, serverId, callbackId, args): #args的结果为:{'uid':123, 'name':'nickname'} print 'OnPlayerJoinOK', args response = {} response['result'] = 1 self.ResponseToServer(serverId, callbackId, response) #master mod class masterServer(MasterSystem): def __init__(self, namespace, systemName): MasterSystem.__init__(self, namespace, systemName) def OnCallback(self, suc, args): #若成功:suc=True,args= {'result' : 1} #若超时,则suc为False if not suc: print 'OnCallback timeout' return print 'OnCallback success', args def testNotifyService(self): player = {} player['uid'] = 123 player['name'] = 'nickname' self.RequestToService("idv_service", "PlayerJoinOKEvent", data, self.OnCallback, 2) ``` #### RegisterRpcMethodForMod - 描述 service接口,监听service/master发过来的请求。service/master使用[RequestToServiceMod](#RequestToServiceMod)发送请求 - 参数 | 参数名 | 数据类型 | 说明 | | :--- | :--- | :--- | | func | function | 监听函数 | | event | str | 事件名 | - 返回值 无 - 示例 ```python #service同master通信示例.service同service通信与此类似,这里不重复了 #service mod class testService(ServiceSystem): def __init__(self,namespace,systemName): ServiceSystem.__init__(self, namespace, systemName) #注册service方法,注意一个事件只能注册一次,否则后面监听函数会覆盖前面监听函数 self.RegisterRpcMethodForMod('PlayerJoinOKEvent', self.OnPlayerJoinOK) def OnPlayerJoinOK(self, serverId, callbackId, args): #args的结果为:{'uid':123, 'name':'nickname'} print 'OnPlayerJoinOK', args response = {} response['result'] = 1 self.ResponseToServer(serverId, callbackId, response) #master mod class masterServer(MasterSystem): def __init__(self, namespace, systemName): MasterSystem.__init__(self, namespace, systemName) def OnCallback(self, suc, args): #若成功:suc=True,args= {'result' : 1} #若超时,则suc为False if not suc: print 'OnCallback timeout' return print 'OnCallback success', args def testNotifyService(self): player = {} player['uid'] = 123 player['name'] = 'nickname' self.RequestToServiceMod("idv_service", "PlayerJoinOKEvent", data, self.OnCallback, 2) ``` #### RequestToService - 描述 service/master接口,给service/master发请求,通常用于官方插件开发,服主请使用[RequestToServiceMod](#RequestToServiceMod) - 参数 | 参数名 | 数据类型 | 说明 | | :--- | :--- | :--- | | module | str | service/master所属模块,需要在service mod的根目录新增mod.json文件并配置module_names,具体可以参考任意插件中service中mod.json配置 | | event | str | 事件名 | | eventData | dict | 事件参数 | | callback | function | 用于处理service/master返回消息, 默认为空,表示没有回调函数。回调函数参数包括:是否成功状态、service/master返回数据。若超时,则参数为False、None | | timeout | int | 回调函数超时时间,单位秒。默认是2s | - 返回值 无 - 示例 ```python #service同master通信示例.service同service通信与此类似,这里不重复了 #service mod class testService(ServiceSystem): def __init__(self,namespace,systemName): ServiceSystem.__init__(self, namespace, systemName) def OnCallbackFromMaster(self, suc, args): #若成功:suc=True,args= {'result' : 'hello'} #若超时,则suc为False if not suc: print 'OnCallback timeout' return print 'OnCallbackFromMaster success', args def testNotifyMaster(self): player = {} player['uid'] = 123 player['name'] = 'nickname' self.RequestToService("master_module", "RequestMasterEvent", player, self.OnCallbackFromMaster, 2) #master mod class masterServer(MasterSystem): def __init__(self, namespace, systemName): MasterSystem.__init__(self, namespace, systemName) #注册master方法,注意一个事件只能注册一次,否则后面监听函数会覆盖前面监听函数 self.RegisterRpcMethod("master_module", 'RequestMasterEvent', self.OnRequestMaster) def OnRequestMaster(self, serverId, callbackId, args): #args结果为:{'uid':123, 'name':'nickname'} print 'OnRequestMaster', args response = {} response['result'] = 'hello' self.ResponseToServer(serverId, callbackId, response) ``` #### RequestToServiceMod - 描述 master接口,给service发请求。要求service调用[RegisterRpcMethodForMod](#RegisterRpcMethodForMod)监听请求 - 参数 | 参数名 | 数据类型 | 说明 | | :--- | :--- | :--- | | modname | string | service进程的type,对应MCStudio中功能服配置下的“类型”配置 | | method | string | 事件名 | | args | dict | 事件参数 | | callback | function | 用于处理service返回消息,默认为空,表示没有回调函数。回调函数参数包括:是否成功状态、service返回数据。若超时,则参数为False、None | | timeout | int | 回调函数超时时间,单位秒。默认是2s | - 返回值 无 - 示例 ```python #service同master通信示例.service同service通信与此类似,这里不重复了。 #service mod class testService(ServiceSystem): def __init__(self,namespace,systemName): ServiceSystem.__init__(self, namespace, systemName) #注册service方法,注意一个事件只能注册一次,否则后面监听函数会覆盖前面监听函数 self.RegisterRpcMethodForMod('PlayerJoinOKEvent', self.OnPlayerJoinOK) def OnPlayerJoinOK(self, serverId, callbackId, args): #args的结果为:{'uid':123, 'name':'nickname'} print 'OnPlayerJoinOK', args response = {} response['result'] = 1 self.ResponseToServer(serverId, callbackId, response) #master mod class masterServer(MasterSystem): def __init__(self, namespace, systemName): MasterSystem.__init__(self, namespace, systemName) def OnCallback(self, suc, args): #若成功:suc=True,args= {'result' : 1} #若超时,则suc为False if not suc: print 'OnCallback timeout' return print 'OnCallback success', args def testNotifyService(self): player = {} player['uid'] = 123 player['name'] = 'nickname' self.RequestToServiceMod("idv_service", "PlayerJoinOKEvent", data, self.OnCallback, 2) ``` #### ResponseToServer - 描述 service/master接口,给service/master返回一个消息。若函数RequestToService的callback参数为空,则不能调用该接口 - 参数 | 参数名 | 数据类型 | 说明 | | :--- | :--- | :--- | | serverId | int | master/service服务器id | | callbackId | int | 回调函数id | | eventData | dict | 事件参数 | - 返回值 无 - 示例 ```python #service同master通信示例.service同service通信与此类似,这里不重复了 #service mod class testService(ServiceSystem): def __init__(self,namespace,systemName): ServiceSystem.__init__(self, namespace, systemName) #注册service方法,注意一个事件只能注册一次,否则后面监听函数会覆盖前面监听函数 self.RegisterRpcMethodForMod('PlayerJoinOKEvent', self.OnPlayerJoinOK) def OnPlayerJoinOK(self, serverId, callbackId, args): #args的结果为:{'uid':123, 'name':'nickname'} print 'OnPlayerJoinOK', args response = {} response['result'] = 1 self.ResponseToServer(serverId, callbackId, response) #master mod class masterServer(MasterSystem): def __init__(self, namespace, systemName): MasterSystem.__init__(self, namespace, systemName) def OnCallback(self, suc, args): #若成功:suc=True,args= {'result' : 1} #若超时,则suc为False if not suc: print 'OnCallback timeout' return print 'OnCallback success', args def testNotifyService(self): player = {} player['uid'] = 123 player['name'] = 'nickname' self.RequestToServiceMod("idv_service", "PlayerJoinOKEvent", data, self.OnCallback, 2) ``` Apollo通信相关api。 ### service和master通信 #### NotifyToMaster - 描述 service接口,service给master发消息。 - 参数 | 参数名 | 数据类型 | 说明 | | :--- | :--- | :--- | | eventName | str | 事件名 | | eventData | dict | 事件参数 | - 返回值 无 - 示例 ```python #service给master发消息。 #master mod class MasterApiSys(MasterSystem): def __init__(self,namespace,systemName): MasterSystem.__init__(self, namespace, systemName) self.ListenForEvent('NeteaseExtraApi', 'extraApiService', 'ServiceEvent', self, self.OnServiceEvent) def OnServiceEvent(self, args): print "OnServiceEvent", args #service mod class ServiceApiSys(ServiceSystem): def __init__(self, namespace, systemName): ServiceSystem.__init__(self, namespace, systemName) def DoSendToMaster(self, args): self.NotifyToMaster("ServiceEvent", args) ``` ### service和game/lobby通信 #### BroadcastToServerByType - 描述 service接口,service给某种类型服务器广播消息 - 参数 | 参数名 | 数据类型 | 说明 | | :--- | :--- | :--- | | serverType | str | lobby/game的服务类型 | | eventName | str | 事件名 | | eventData | dict | 事件参数 | - 返回值 无 - 示例 ```python #service同game/lobby通信示例 #service mod import server.extraServiceApi as serviceApi ServiceSystem = serviceApi.GetServiceSystemCls() class testService(ServiceSystem): def __init__(self,namespace,systemName): ServiceSystem.__init__(self, namespace, systemName) def testNotify(self): player = {} player['uid'] = 123 player['name'] = 'nickname' self.BroadcastToServerByType('battle_game_server_type', "PlayerJoinEvent", player) #lobby mod(服务器类型为battle_game_server_type) class lobbyServer(ServerSystem): def __init__(self, namespace, systemName): ServerSystem.__init__(self, namespace, systemName) self.ListenForEvent('serviceNamespace', 'serviceSystem', 'PlayerJoinEvent', self, self.OnPlayerJoin) def OnPlayerJoin(self, args): #args的结果为:{'uid':123, 'name':'nickname'} print 'OnPlayerJoin', args ``` #### BroadcastToService - 描述 service/lobby/game接口,service/lobby/game给所有service广播消息。 - 参数 | 参数名 | 数据类型 | 说明 | | :--- | :--- | :--- | | eventName | str | 事件名 | | eventData | dict | 事件参数 | - 返回值 无 - 示例 ```python #service/lobby/game给所有service广播消息。 #service mod class ServiceApiSys(ServiceSystem): def __init__(self,namespace,systemName): ServiceSystem.__init__(self, namespace, systemName) self.ListenForEvent("NeteaseExtraApi", "extraApiDev", "ServerBroadcastEvent", self, self.OnServerBroadcastEvent) self.ListenForEvent("NeteaseExtraApi", "extraApiService", "ServiceBroadcastEvent", self, self.OnServiceBroadcastEvent) def OnServerBroadcastEvent(self, args): print "OnServerBroadcastEvent", args self.BroadcastToService("ServiceBroadcastEvent", args) def OnServiceBroadcastEvent(self, args): print "OnServiceBroadcastEvent", args #lobby mod class lobbyServer(ServerSystem): def __init__(self, namespace, systemName): ServerSystem.__init__(self, namespace, systemName) def DoBroadcastToService(self, args): self.BroadcastToService("ServerBroadcastEvent", args) ``` #### NotifyToServerNode - 描述 service接口,service给某个lobby/game发消息。 - 参数 | 参数名 | 数据类型 | 说明 | | :--- | :--- | :--- | | targetId | int | lobby/game的服务器id | | eventName | str | 事件名 | | eventData | dict | 事件参数 | - 返回值 无 - 示例 ```python #service给game/lobby发消息 #service mod class testService(ServiceSystem): def __init__(self,namespace,systemName): ServiceSystem.__init__(self, namespace, systemName) def testNotifyServer(self): player = {} player['uid'] = 123 player['name'] = 'nickname' self.NotifyToServerNode(4000, "PlayerJoinEvent", player) #lobby mod class lobbyServer(ServerSystem): def __init__(self, namespace, systemName): ServerSystem.__init__(self, namespace, systemName) self.ListenForEvent('serviceNamespace', 'serviceSystem', 'PlayerJoinEvent', self, self.OnPlayerJoin) def OnPlayerJoin(self, args): #args的结果为:{'uid':123, 'name':'nickname'} print 'OnPlayerJoin', args ``` #### NotifyToServiceNode - 描述 service/lobby/game接口,service/lobby/game给某个service发消息。 - 参数 | 参数名 | 数据类型 | 说明 | | :--- | :--- | :--- | | targetId | int | service的服务器id | | eventName | str | 事件名 | | eventData | dict | 事件参数 | - 返回值 无 - 示例 ```python #service/lobby/game给某个service发消息 #service mod class ServiceApiSys(ServiceSystem): def __init__(self,namespace,systemName): ServiceSystem.__init__(self, namespace, systemName) self.ListenForEvent("NeteaseExtraApi", "extraApiDev", "ServerEvent", self, self.OnServerEvent) self.ListenForEvent("NeteaseExtraApi", "extraApiService", "ServiceEvent", self, self.OnServiceEvent) def OnServerEvent(self, args): print "OnServerEvent", args self.NotifyToServiceNode(8001, "ServiceEvent", args) def OnServiceEvent(self, args): print "OnServiceEvent", args #lobby mod class lobbyServer(ServerSystem): def __init__(self, namespace, systemName): ServerSystem.__init__(self, namespace, systemName) def DoSendToService(self, args): self.NotifyToServiceNode(8000, "ServerEvent", args) ``` #### RegisterRpcMethod - 描述 service接口,通常用于官方插件开发,服主请使用[RegisterRpcMethodForMod](#RegisterRpcMethodForMod)。本接口注册一个监听函数,用于监听lobby/game发过来的请求。 - 参数 | 参数名 | 数据类型 | 说明 | | :--- | :--- | :--- | | module | str | service所属模块,需要在service mod的根目录新增mod.json文件并配置module_names,具体可以参考任意插件中service中mod.json配置 | | func | function | 监听函数 | | event | str | 事件名 | - 返回值 无 - 示例 ```python #service同game/lobby通信示例 #service mod class testService(ServiceSystem): def __init__(self,namespace,systemName): ServiceSystem.__init__(self, namespace, systemName) self.RegisterRpcMethod("idv_service", 'PlayerJoinOKEvent', self.OnPlayerJoinOK) def OnPlayerJoinOK(self, serverId, callbackId, args): #args的结果为:{'uid':123, 'name':'nickname'} print 'OnPlayerJoinOK', args #lobby mod class lobbyServer(ServerSystem): def __init__(self, namespace, systemName): ServerSystem.__init__(self, namespace, systemName) def testNotifyService(self): player = {} player['uid'] = 123 player['name'] = 'nickname' self.RequestToService("idv_service", "PlayerJoinOKEvent", args) ``` #### RegisterRpcMethodForMod - 描述 service接口,监听lobby/game发过来的请求,lobby/game使用[RequestToServiceMod](#RequestToServiceMod)发送请求 - 参数 | 参数名 | 数据类型 | 说明 | | :--- | :--- | :--- | | method | string | 事件名 | | func | function | 监听函数 | - 返回值 无 - 示例 ```python #service同game/lobby通信示例 #service mod class testService(ServiceSystem): def __init__(self,namespace,systemName): ServiceSystem.__init__(self, namespace, systemName) self.RegisterRpcMethodForMod('PlayerJoinOKEvent', self.OnPlayerJoinOK) def OnPlayerJoinOK(self, serverId, callbackId, args): #args的结果为:{'uid':123, 'name':'nickname'} print 'OnPlayerJoinOK', args response = {} response['result'] = 1 self.ResponseToServer(serverId, callbackId, response) #lobby mod class lobbyServer(ServerSystem): def __init__(self, namespace, systemName): ServerSystem.__init__(self, namespace, systemName) def OnCallback(self, suc, args): #若成功:suc=True,args= {'result' : 1} #若超时,则suc为False if not suc: print 'OnCallback timeout' return print 'OnCallback success', args def testNotifyService(self): player = {} player['uid'] = 123 player['name'] = 'nickname' self.RequestToServiceMod("idv_service", "PlayerJoinOKEvent", args, self.OnCallback, 2) ``` #### RequestToService - 描述 service/lobby/game接口,通常用于官方插件开发,服主请使用[RequestToServiceMod](#RequestToServiceMod)。lobby/game给service发请求,两个service间可以通过这个接口通信 - 参数 | 参数名 | 数据类型 | 说明 | | :--- | :--- | :--- | | module | str | service所属模块,需要在service mod的根目录新增mod.json文件并配置module_names,具体可以参考任意插件中service中mod.json配置 | | event | str | 事件名 | | eventData | dict | 事件参数 | | callback | function | 用于处理service返回消息,默认为空,表示没有回调函数。回调函数参数包括:是否成功状态、service返回数据。若超时,则参数为False、None | | timeout | int | 回调函数超时时间,单位秒。默认是2s | - 返回值 无 - 示例 ```python #service同game/lobby通信示例 #service mod class testService(ServiceSystem): def __init__(self,namespace,systemName): ServiceSystem.__init__(self, namespace, systemName) self.RegisterRpcMethod("idv_service", 'PlayerJoinOKEvent', self.OnPlayerJoinOK) def OnPlayerJoinOK(self, serverId, callbackId, args): #args的结果为:{'uid':123, 'name':'nickname'} print 'OnPlayerJoinOK', args #lobby mod class lobbyServer(ServerSystem): def __init__(self, namespace, systemName): ServerSystem.__init__(self, namespace, systemName) def testNotifyService(self): player = {} player['uid'] = 123 player['name'] = 'nickname' self.RequestToService("idv_service", "PlayerJoinOKEvent", args) ``` #### RequestToServiceMod - 描述 lobby/game接口,lobby/game给service发送事件。要求service调用[RegisterRpcMethodForMod](#RegisterRpcMethodForMod)监听请求 - 参数 | 参数名 | 数据类型 | 说明 | | :--- | :--- | :--- | | modname | string | service进程的type,对应MCStudio中功能服配置下的“类型”配置 | | method | string | 事件名 | | args | dict | 事件参数 | | callback | function | 用于处理service返回消息,默认为空,表示没有回调函数。回调函数参数包括:是否成功状态、service返回数据。若超时,则参数为False、None | | timeout | int | 回调函数超时时间,单位秒。默认是2s | - 返回值 无 - 示例 ```python #service同game/lobby通信示例 #service mod class testService(ServiceSystem): def __init__(self,namespace,systemName): ServiceSystem.__init__(self, namespace, systemName) self.RegisterRpcMethodForMod('PlayerJoinOKEvent', self.OnPlayerJoinOK) def OnPlayerJoinOK(self, serverId, callbackId, args): #args的结果为:{'uid':123, 'name':'nickname'} print 'OnPlayerJoinOK', args response = {} response['result'] = 1 self.ResponseToServer(serverId, callbackId, response) #lobby mod class lobbyServer(ServerSystem): def __init__(self, namespace, systemName): ServerSystem.__init__(self, namespace, systemName) def OnCallback(self, suc, args): #若成功:suc=True,args= {'result' : 1} #若超时,则suc为False if not suc: print 'OnCallback timeout' return print 'OnCallback success', args def testNotifyService(self): player = {} player['uid'] = 123 player['name'] = 'nickname' self.RequestToServiceMod("idv_service", "PlayerJoinOKEvent", args, self.OnCallback, 2) ``` #### ResponseToServer - 描述 service接口,给lobby/game返回一个消息。若函数RequestToService的callback参数为空,则不能调用该接口 - 参数 | 参数名 | 数据类型 | 说明 | | :--- | :--- | :--- | | serverId | int | lobby/game服务器id | | callbackId | int | 回调函数id | | eventData | dict | 事件参数 | - 返回值 无 - 示例 ```python #service同game/lobby通信示例 #service mod class testService(ServiceSystem): def __init__(self,namespace,systemName): ServiceSystem.__init__(self, namespace, systemName) self.RegisterRpcMethodForMod('PlayerJoinOKEvent', self.OnPlayerJoinOK) def OnPlayerJoinOK(self, serverId, callbackId, args): #args的结果为:{'uid':123, 'name':'nickname'} print 'OnPlayerJoinOK', args response = {} response['result'] = 1 self.ResponseToServer(serverId, callbackId, response) #lobby mod class lobbyServer(ServerSystem): def __init__(self, namespace, systemName): ServerSystem.__init__(self, namespace, systemName) def OnCallback(self, suc, args): #若成功:suc=True,args= {'result' : 1} #若超时,则suc为False if not suc: print 'OnCallback timeout' return print 'OnCallback success', args def testNotifyService(self): player = {} player['uid'] = 123 player['name'] = 'nickname' self.RequestToServiceMod("idv_service", "PlayerJoinOKEvent", args, self.OnCallback, 2) ``` Apollo通信相关api。 ### client和service通信 #### NotifyToServiceNode - 描述 客户端接口,给service服务器发送事件 - 参数 | 参数名 | 数据类型 | 说明 | | :--- | :--- | :--- | | serverId | int | 服务器id | | eventName | str | 事件名 | | eventData | dict | 事件参数,包含:`__neteaseProxyId__`,表示当前客户端连接的proxy服务器id;`__uid__`,表示当前客户端的uid | - 返回值 无 - 示例 ```python #客户端给service发送消息的示例 #client mod import client.extraClientApi as clientApi ClientSystem = clientApi.GetClientSystemCls() class testClient(ClientSystem): def __init__(self,namespace,systemName): ClientSystem.__init__(self, namespace, systemName) def testNotify(self): player = {} player['name'] = 'nickname' self.NotifyToServiceNode(8000, 'ClientToServiceEvent', player) #service mod class testService(ServiceSystem): def __init__(self, namespace, systemName): ServiceSystem.__init__(self, namespace, systemName) self.ListenForEvent('clientNamespace', 'clientSystem', 'ClientToServiceEvent', self, self.OnClientToService) def OnClientToService(self, args): #args结果:{'__neteaseProxyId__': 2000, '__uid__': 123, 'name': nickname} print 'OnClientToService', args ``` #### RemoteNotifyToClient - 描述 service接口,service发送事件到指定客户端 - 参数 | 参数名 | 数据类型 | 说明 | | :--- | :--- | :--- | | uid | int/long | 玩家的netease uid,玩家的唯一标识 | | proxyId | int | 当前客户端连接的proxy服务器id,可以通过NotifyToServiceNode、AddServerPlayerEvent、GetOnlineServerInfoOfPlayer、GetOnlineServerInfoOfMultiPlayers接口或事件获取该参数 | | eventName | str | 事件名 | | eventData | dict | 事件参数 | - 返回值 无 - 示例 ```python #service给客户端发送消息的示例 #client mod import client.extraClientApi as clientApi ClientSystem = clientApi.uid() class testClient(ClientSystem): def __init__(self,namespace,systemName): ClientSystem.__init__(self, namespace, systemName) self.ListenForEvent('serviceNamespace', 'serviceSystem', 'ServiceToClientEvent', self, self.OnServiceToClient) def OnServiceToClient(self, args): #args的结果:{'uid': 123, 'name': nickname} print 'OnServiceToClient', args #service mod class testService(ServiceSystem): def __init__(self, namespace, systemName): ServiceSystem.__init__(self, namespace, systemName) def testNotify(self): player = {} player['uid'] = 123 player['name'] = 'nickname' self.RemoteNotifyToClient(123, 8000, 'ServiceToClientEvent', player) ```