Example #1
0
        static int Start(string[] args)
        {
            AssemblyName[] assemblies = Assembly.GetEntryAssembly().GetReferencedAssemblies();
            foreach (AssemblyName assembly in assemblies)
            {
                Assembly.Load(assembly);
            }

            LoggerProxy.Init(Resources.log4net_config);

            CommandArgs commandArg = CommandLine.Parse(args);
            Dictionary <string, string> argPairs = commandArg.argPairs;

            int maxClient;

            if (!argPairs.ContainsKey("c"))
            {
                maxClient = 10;
            }
            else
            {
                if (!int.TryParse(argPairs["c"], out maxClient))
                {
                    Logger.Log("最大连接数解析错误");
                    return(1);
                }
            }
            if (!argPairs.ContainsKey("p"))
            {
                Logger.Log("没有指定端口");
                return(1);
            }
            if (!int.TryParse(argPairs["p"], out int _port))
            {
                Logger.Log("端口解析错误");
                return(1);
            }
            int useUDP;

            if (!argPairs.ContainsKey("t"))
            {
                useUDP = 0;
            }
            else
            {
                if (!int.TryParse(argPairs["t"], out useUDP))
                {
                    Logger.Log("协议类型解析错误");
                    return(1);
                }
            }
            if (!argPairs.ContainsKey("d"))
            {
                Logger.Log("无效的配置文件路径");
                return(1);
            }
            string defFile = argPairs["d"];
            string json;

            try
            {
                json = File.ReadAllText(defFile);
            }
            catch (Exception e)
            {
                Logger.Log(e);
                return(1);
            }

            Defs.Init(json);

            _handlerCenter = new HandlerCenter();
            NetworkManager.PType protocolType = useUDP > 0 ? NetworkManager.PType.Kcp : NetworkManager.PType.Tcp;
            if (protocolType == NetworkManager.PType.Kcp)
            {
                NetworkManager.SetupKCP();
            }
            NetworkManager.AddPacketTypes();
            NetworkManager.CreateServer(NETWORK_NAME, protocolType, maxClient);
            NetworkManager.AddServerEventHandler(NETWORK_NAME, ProcessServerEvent);
            NetworkManager.StartServer(NETWORK_NAME, _port);
            Logger.Log($"Server started, listening port: {_port}");

            Thread inputThread = new Thread(InputWorker);

            inputThread.IsBackground = true;
            inputThread.Start();

            System.Diagnostics.Stopwatch sp = new System.Diagnostics.Stopwatch();
            sp.Start();
            long lastElapsed = 0;

            while (!_disposed)
            {
                long elapsed = sp.ElapsedMilliseconds;
                long dt      = elapsed - lastElapsed;
                NetworkManager.Update(dt);
                lastElapsed = elapsed;
                ProcessInput();
                Thread.Sleep(10);
            }
            sp.Stop();

            inputThread.Join();
            LoggerProxy.Dispose();
            return(0);
        }