Пример #1
0
        /// <summary>
        /// 启动服务器!
        /// </summary>
        /// <param name="message"></param>
        public async void Run(string message = "服务器运行起来了!")
        {
            if (Instance is null)
            {
                Instance = this;
            }
            else
            {
                Logger.Log("只允许同时启动一个服务器!", LogLevel.Warn);
                return;
            }
            // 处理未观察到的异常
            TaskScheduler.UnobservedTaskException += (sender, eventArgs) =>
            {
                eventArgs.SetObserved();
                (eventArgs.Exception).Handle(e =>
                {
                    Logger.Log($"Exception type: {e.GetType()}\n{e}", LogLevel.Error);
                    return(true);
                });
            };
            // 加载解析器
            Parser = new Parser(RequestHandleAsync, ResponseHandleAsync);
            // 加载中间件
            RequestMiddleware  = new RequestMiddleware(this);
            ResponseMiddleware = new ResponseMiddleware(this);
            // 初始化连接池 与最大连接数保持一致
            foreach (var i in Enumerable.Range(0, MaxConnection))
            {
                FreeClients.Enqueue(new Client(this));
            }
            // 初始化房间
            foreach (var i in Enumerable.Range(0, MaxRoomNumbers))
            {
                FreeRooms.Enqueue(new Room(i));
            }

            Logger.Log($"初始化了{FreeClients.Count}个对等客户端");
            // 设置请求队列的最大值
            Listener.Start(MaxConnection);
            Logger.Log(message);
            // Test
            for (int i = 1; i < 3; i++)
            {
                var room = GetRoom();
                room.Init(GetClient(), i, i * 2, $"TestRoom{i}");
            }

            //
            // 异步接受客户端连接请求
            await AcceptAsync();
        }
Пример #2
0
        private Client GetClient()
        {
            Client client;

            lock (FreeClients)
            {
                client = FreeClients.Any() ? FreeClients.Dequeue() : null;
            }

            if (client != null)
            {
                lock (UsingClients) { UsingClients.Add(client); }
            }

            return(client);
        }
Пример #3
0
        public void FreeClient(Client client)
        {
            lock (UsingClients) { UsingClients.Remove(client); }

            lock (FreeClients) { FreeClients.Enqueue(client); }
        }