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; }
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(); }