Пример #1
0
        public bool StartServer()
        {
            if (m_iPort == 0) throw new ArgumentNullException("Не указан порт");
            m_Messenger = new Messenger(m_iPort);

            StopServer();
            Console.WriteLine("Запуск сервера...");

            // Читаем консольные команды в новом потоке
            var commandReader = new Thread(ReadCommands);
            commandReader.Name = "Command Reader";
            commandReader.IsBackground = true;
            commandReader.Start();

            IPEndPoint ipendpoint = null;
            var stream = new System.IO.MemoryStream();
            try
            {
                m_bIsRunning = true;
                Console.WriteLine("Сервер запущен, ожидание подключений...");
                // Слушаем команды от потенциальных клиентов
                while (IsRunning)
                {
                    try
                    {
                        var cmd = m_Messenger.Receive(ref stream, ref ipendpoint);
                        if (cmd == null) continue;
                        //Console.WriteLine("Получена команда {0} от {1}:{2} ", cmd.Name, ipendpoint.Address, ipendpoint.Port);
                        ClientManager.Instance.AddAndRun(ipendpoint, cmd);
                    }
                    catch (SocketException ex)
                    {
                        // Сервер остановлен из вне
                        // Здесь не выполняется остановка сервера, только прерывание цикла
                        if (ex.SocketErrorCode == SocketError.Interrupted) break;
                        else
                        {
                            System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace(ex, true);
                            Console.WriteLine("[{2} ({3})] {0}: {1}", ex.ToString(), ex.Message, trace.GetFrame(0).GetFileName(), trace.GetFrame(0).GetFileLineNumber());
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Ошибка при запуске сервера: {0}", ex.ToString());
            }

            return false;
        }
Пример #2
0
        static void Main(string[] args)
        {
            /*
             * По аналогии с сервером рекомендую использовать CommandWorker
             * для отправки команд и реализовать в основном потоке
             * обработку получаемых сообщений (т.е. клиент тоже является сервером).
             * ============================
             * Мультимедия: SFML
             * База данных: PostgreSQL
             * В VS необходимо установить расширение NuGet
             * Вся игровая логика, необходимая для клиента и сервера, находится в LS_GameLogic
             * Весь сетевой интерфейс, необходимый для клиента и сервера, находится в LS_Network
             *
             * Также, для совместного использования, нужно установить расширение GitExtensions
             *
            */

            IPEndPoint ipendpoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 15000);
            var messenger = new Messenger();

            // Отправляем запрос на соединение
            var cmd = new Command("connect",
                new KeyValuePair<string, object>("login", "vasya"),
                new KeyValuePair<string, object>("password", "pupkin")
                );
            messenger.Send(ipendpoint, cmd);

            // Получаем ответ
            /*IPEndPoint ipendpoint2 = null;
            var stream = new System.IO.MemoryStream();
            cmd = messenger.Receive(ref stream, ref ipendpoint2);
            if (cmd.Name == "connect")
            {
                if ((bool)cmd.Args["success"] == true)
                    Console.WriteLine("Вы успешно подключились к серверу!");
                else Console.WriteLine("Ошибка, при попытке подключения к серверу");
            }
            else Console.WriteLine("Получена неизвестная команда от сервера: {0}", cmd.Name);*/

            LS_GameLogic.Game game = new Game();
            game.Run();
        }