Пример #1
0
        public async Task MainAsync()
        {
            WriteTitle();

            if (!File.Exists(CONFIG_PATH))
            {
                File.WriteAllText(CONFIG_PATH, JsonConvert.SerializeObject(new Config(), Formatting.Indented));
                WriteLogMessage("A config.json file was generated. Please configure it to the proper settings and re-run!", ConsoleColor.Yellow);
                Console.ReadKey();
                Environment.Exit(0);
            }
            else
            {
                conf = JsonConvert.DeserializeObject <Config>(File.ReadAllText(CONFIG_PATH));
                try
                {
                    var asm = Assembly.LoadFile(Directory.GetCurrentDirectory() + @"\" + conf.TransportDLL);
                    WriteLogMessage($"Loaded Assembly: {asm.FullName}", ConsoleColor.Green);

                    transport = asm.CreateInstance(conf.TransportClass) as Transport;

                    if (transport != null)
                    {
                        var transportClass = asm.GetType(conf.TransportClass);

                        WriteLogMessage($"Loaded Transport: {transportClass.Name}! Loading Methods...", ConsoleColor.Green);
                        CheckMethods(transportClass);

                        if (_awakeMethod != null)
                        {
                            _awakeMethod.Invoke(transport, null);
                            WriteLogMessage("Called Awake on transport.", ConsoleColor.Yellow);
                        }

                        if (_startMethod != null)
                        {
                            _awakeMethod.Invoke(transport, null);
                            WriteLogMessage("Called Start on transport.", ConsoleColor.Yellow);
                        }

                        WriteLogMessage("Starting Transport...", ConsoleColor.Green);

                        transport.OnServerError = (clientID, error) =>
                        {
                            WriteLogMessage($"Transport Error, Client: {clientID}, Error: {error}", ConsoleColor.Red);
                        };

                        transport.OnServerConnected = (clientID) =>
                        {
                            WriteLogMessage($"Transport Connected, Client: {clientID}", ConsoleColor.Cyan);
                            _currentConnections.Add(clientID);
                            _relay.ClientConnected(clientID);
                        };

                        _relay = new RelayHandler(transport.GetMaxPacketSize(0));

                        transport.OnServerDataReceived = _relay.HandleMessage;
                        transport.OnServerDisconnected = (clientID) =>
                        {
                            _currentConnections.Remove(clientID);
                            _relay.HandleDisconnect(clientID);
                        };

                        transport.ServerStart();

                        WriteLogMessage("Transport Started!", ConsoleColor.Green);
                    }
                    else
                    {
                        WriteLogMessage("Transport Class not found! Please make sure to include namespaces.", ConsoleColor.Red);
                        Console.ReadKey();
                        Environment.Exit(0);
                    }
                }
                catch (Exception e)
                {
                    WriteLogMessage("Exception: " + e, ConsoleColor.Red);
                    Console.ReadKey();
                    Environment.Exit(0);
                }
            }

            while (true)
            {
                if (_updateMethod != null)
                {
                    _updateMethod.Invoke(transport, null);
                }
                if (_lateUpdateMethod != null)
                {
                    _lateUpdateMethod.Invoke(transport, null);
                }

                _currentHeartbeatTimer++;

                if (_currentHeartbeatTimer >= conf.UpdateHeartbeatInterval)
                {
                    _currentHeartbeatTimer = 0;

                    for (int i = 0; i < _currentConnections.Count; i++)
                    {
                        transport.ServerSend(_currentConnections[i], 0, new ArraySegment <byte>(new byte[] { 200 }));
                    }

                    GC.Collect();
                }

                await Task.Delay(conf.UpdateLoopTime);
            }
        }
Пример #2
0
        private void ConfigureTransport(Assembly asm)
        {
            var transportClass = asm.GetType(conf.TransportClass);

            WriteLogMessage("OK", ConsoleColor.Green);

            WriteLogMessage("\nLoading Transport Methods... ", ConsoleColor.White, true);
            CheckMethods(transportClass);
            WriteLogMessage("OK", ConsoleColor.Green);

            WriteLogMessage("\nInvoking Transport Methods...");

            if (_awakeMethod != null)
            {
                _awakeMethod.Invoke(transport, null);
            }

            if (_startMethod != null)
            {
                _startMethod.Invoke(transport, null);
            }

            WriteLogMessage("\nStarting Transport... ", ConsoleColor.White, true);

            transport.OnServerError = (clientID, error) =>
            {
                WriteLogMessage($"Transport Error, Client: {clientID}, Error: {error}", ConsoleColor.Red);
            };

            transport.OnServerConnected = (clientID) =>
            {
                WriteLogMessage($"Transport Connected, Client: {clientID}", ConsoleColor.Cyan);
                _currentConnections.Add(clientID);
                _relay.ClientConnected(clientID);

                if (conf.EnableNATPunchtroughServer)
                {
                    string natID = Guid.NewGuid().ToString();
                    _pendingNATPunches.Add(clientID, natID);
                    _NATRequestPosition = 0;
                    _NATRequest.WriteByte(ref _NATRequestPosition, (byte)OpCodes.RequestNATConnection);
                    _NATRequest.WriteString(ref _NATRequestPosition, natID);
                    _NATRequest.WriteInt(ref _NATRequestPosition, conf.NATPunchtroughPort);
                    transport.ServerSend(clientID, 0, new ArraySegment <byte>(_NATRequest, 0, _NATRequestPosition));
                }
            };

            _relay = new RelayHandler(transport.GetMaxPacketSize(0));

            transport.OnServerDataReceived = _relay.HandleMessage;
            transport.OnServerDisconnected = (clientID) =>
            {
                _currentConnections.Remove(clientID);
                _relay.HandleDisconnect(clientID);

                if (NATConnections.ContainsKey(clientID))
                {
                    NATConnections.Remove(clientID);
                }

                if (_pendingNATPunches.TryGetByFirst(clientID, out _))
                {
                    _pendingNATPunches.Remove(clientID);
                }
            };

            transport.ServerStart(conf.TransportPort);

            WriteLogMessage("OK", ConsoleColor.Green);
        }