예제 #1
0
        public override void OnServerReceive(TransportEventData eventData)
        {
            CentralServerPeerInfo tempPeerInfo;

            switch (eventData.type)
            {
            case ENetworkEvent.ConnectEvent:
                Logging.Log(LogTag, "OnPeerConnected peer.ConnectionId: " + eventData.connectionId);
                ConnectionIds.Add(eventData.connectionId);
                break;

            case ENetworkEvent.DataEvent:
                ReadPacket(eventData.connectionId, eventData.reader);
                break;

            case ENetworkEvent.DisconnectEvent:
                Logging.Log(LogTag, "OnPeerDisconnected peer.ConnectionId: " + eventData.connectionId + " disconnectInfo.Reason: " + eventData.disconnectInfo.Reason);
                ConnectionIds.Remove(eventData.connectionId);
                // Remove disconnect map spawn server
                MapSpawnServerPeers.Remove(eventData.connectionId);
                // Remove disconnect map server
                if (MapServerPeers.TryGetValue(eventData.connectionId, out tempPeerInfo))
                {
                    MapServerPeersByMapId.Remove(tempPeerInfo.extra);
                    MapServerPeersByInstanceId.Remove(tempPeerInfo.extra);
                    MapServerPeers.Remove(eventData.connectionId);
                    RemoveMapUsers(eventData.connectionId);
                }
                break;

            case ENetworkEvent.ErrorEvent:
                Logging.LogError(LogTag, "OnPeerNetworkError endPoint: " + eventData.endPoint + " socketErrorCode " + eventData.socketError + " errorMessage " + eventData.errorMessage);
                break;
            }
        }
예제 #2
0
 protected override void OnStopServer()
 {
     base.OnStopServer();
     MapUsersByCharacterId.Clear();
     ConnectionIdsByCharacterId.Clear();
     ConnectionIdsByCharacterName.Clear();
     MapSpawnServerPeers.Clear();
     MapServerPeers.Clear();
     MapServerPeersByMapId.Clear();
     MapServerPeersByInstanceId.Clear();
 }
예제 #3
0
        private async UniTaskVoid HandleRequestAppServerAddress(
            RequestHandlerData requestHandler,
            RequestAppServerAddressMessage request,
            RequestProceedResultDelegate <ResponseAppServerAddressMessage> result)
        {
            long                  connectionId = requestHandler.ConnectionId;
            UITextKeys            message      = UITextKeys.NONE;
            CentralServerPeerInfo peerInfo     = new CentralServerPeerInfo();

            switch (request.peerType)
            {
            // TODO: Balancing servers when there are multiple servers with same type
            case CentralServerPeerType.MapSpawnServer:
                if (MapSpawnServerPeers.Count > 0)
                {
                    peerInfo = MapSpawnServerPeers.Values.First();
                    Logging.Log(LogTag, "Request Map Spawn Address: [" + connectionId + "]");
                }
                else
                {
                    message = UITextKeys.UI_ERROR_SERVER_NOT_FOUND;
                    Logging.Log(LogTag, "Request Map Spawn Address: [" + connectionId + "] [" + message + "]");
                }
                break;

            case CentralServerPeerType.MapServer:
                string mapName = request.extra;
                if (!MapServerPeersByMapId.TryGetValue(mapName, out peerInfo))
                {
                    message = UITextKeys.UI_ERROR_SERVER_NOT_FOUND;
                    Logging.Log(LogTag, "Request Map Address: [" + connectionId + "] [" + mapName + "] [" + message + "]");
                }
                break;

            case CentralServerPeerType.InstanceMapServer:
                string instanceId = request.extra;
                if (!MapServerPeersByInstanceId.TryGetValue(instanceId, out peerInfo))
                {
                    message = UITextKeys.UI_ERROR_SERVER_NOT_FOUND;
                    Logging.Log(LogTag, "Request Map Address: [" + connectionId + "] [" + instanceId + "] [" + message + "]");
                }
                break;
            }
            // Response
            result.Invoke(
                message == UITextKeys.NONE ? AckResponseCode.Success : AckResponseCode.Error,
                new ResponseAppServerAddressMessage()
            {
                message  = message,
                peerInfo = peerInfo,
            });
            await UniTask.Yield();
        }
예제 #4
0
        private async UniTaskVoid HandleRequestAppServerRegister(
            RequestHandlerData requestHandler,
            RequestAppServerRegisterMessage request,
            RequestProceedResultDelegate <ResponseAppServerRegisterMessage> result)
        {
            long       connectionId = requestHandler.ConnectionId;
            UITextKeys message      = UITextKeys.NONE;

            if (request.ValidateHash())
            {
                CentralServerPeerInfo peerInfo = request.peerInfo;
                peerInfo.connectionId = connectionId;
                switch (request.peerInfo.peerType)
                {
                case CentralServerPeerType.MapSpawnServer:
                    MapSpawnServerPeers[connectionId] = peerInfo;
                    Logging.Log(LogTag, "Register Map Spawn Server: [" + connectionId + "]");
                    break;

                case CentralServerPeerType.MapServer:
                    // Extra is map ID
                    if (!MapServerPeersByMapId.ContainsKey(peerInfo.extra))
                    {
                        BroadcastAppServers(connectionId, peerInfo);
                        // Collects server data
                        MapServerPeersByMapId[peerInfo.extra] = peerInfo;
                        MapServerPeers[connectionId]          = peerInfo;
                        Logging.Log(LogTag, "Register Map Server: [" + connectionId + "] [" + peerInfo.extra + "]");
                    }
                    else
                    {
                        message = UITextKeys.UI_ERROR_MAP_EXISTED;
                        Logging.Log(LogTag, "Register Map Server Failed: [" + connectionId + "] [" + peerInfo.extra + "] [" + message + "]");
                    }
                    break;

                case CentralServerPeerType.InstanceMapServer:
                    // Extra is instance ID
                    if (!MapServerPeersByInstanceId.ContainsKey(peerInfo.extra))
                    {
                        BroadcastAppServers(connectionId, peerInfo);
                        // Collects server data
                        MapServerPeersByInstanceId[peerInfo.extra] = peerInfo;
                        MapServerPeers[connectionId] = peerInfo;
                        Logging.Log(LogTag, "Register Instance Map Server: [" + connectionId + "] [" + peerInfo.extra + "]");
                    }
                    else
                    {
                        message = UITextKeys.UI_ERROR_EVENT_EXISTED;
                        Logging.Log(LogTag, "Register Instance Map Server Failed: [" + connectionId + "] [" + peerInfo.extra + "] [" + message + "]");
                    }
                    break;
                }
            }
            else
            {
                message = UITextKeys.UI_ERROR_INVALID_SERVER_HASH;
                Logging.Log(LogTag, "Register Server Failed: [" + connectionId + "] [" + message + "]");
            }
            // Response
            result.Invoke(
                message == UITextKeys.NONE ? AckResponseCode.Success : AckResponseCode.Error,
                new ResponseAppServerRegisterMessage()
            {
                message = message,
            });
            await UniTask.Yield();
        }