Внимание!

Эта публикация перенесена в раздел уроков по адресу Пишем он-лайн игру: Часть первая. Основы.
К ней прикреплена новая отдельная ветка комментариев форума, которую вы можетет найти после текста публикации.
Обсуждение публикации рекуомендуется вести по новому адресу, который указан выше.

Пишем он-лайн игру: Часть первая. Основы

В этом части я расскажу вам, какие бывают виды организации он-лайн игр, в чем их плюсы и минусы. Итак, начнем.
Написать он-лайн игру, можно воспользоваться двумя схемами:

Первая - клиент-сервер:

Есть куча клиентов, которые обмениваются информацией передавая ее серверу, а сервер уже отправляет информацию другим клиентам. Это самая распространенная схема, она всегда используется в веб серверах, и более чем часто в тех же он-лайн играх. Минус всего лишь один: нагрузка на сервер. Схема выглядит следующим образом:



Вторая - клиент-клиент:

Тут все проще, клиент конектится с другим клиентом и они обмениваются информацией. В этой схеме минусов больше. Мало того, что эта схема поддерживает только двух клиентов, так еще если увеличить их количество, то на одного клиента будут приходиться все остальные. Т.е. нагрузка на сеть и вычислительные способности каждого клиента будут равны нагрузке на сервер. А если у нас в игре 60 клиентов, то каждый другой будет обрабатывать все 59 других - а это не есть good. Поэтому если и использовать эту схему для своей игры, то только для игры на двоих, типа шахмат или аирхоккея. Схема выглядит вот так:
<p align="center">


Далее я на словах и на деле попытаюсь объяснить вам о том, как эти две схемы использовать в своих играх. Начнем, естественно, с первой схемы "клиент-сервер". Итак, разберемся все таки, что делает сервер.

Что есть сервер?
Сервер - да, это вот такая вот штука, которая прослушивает нужный порт на предмет подключения, а тем временем порт - это точка доступа к серверу к которой подключаются клиенты. Например, веб-сервер нашего уютненький http://esate.ru работает по порту 80. Чтобы подключиться к его веб-серверу откроем клиент telnet в ОС Windows (как его установить, можно узнать тут) или откроем "Командную строку", и введем следующую команду:

/*http://esate.ru, ProCoder*/

telnet esate.ru 80

И получим HTML код:

/*http://esate.ru, ProCoder*/

<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx/0.7.67</center>
</body>
</html>

Клиент подключился к серверу esate.ru, сервер отправил ему ответ и отключил клиента от себя. Типичное поведение веб-сервера. Сразу стало ясно, что нам нужно, чтобы написать простой сервер. Нам нужно прослушивать определенный порт на наличие клиентов, как только он появится - решать что с ним делать, но это мы будет чуть позже.

Итак. Мы будет использовать протокол TCP/IP. У платформы .NET есть класс для организации сервера. Называется он TCPListener, а находится в пространстве имен System.Net.Sockets:
Ах да, создадим для начала консольный проект на версии .NET Framework 3.5, я его назову EsateGameServer (первое что пришло в голову).
И кое какие приготовления: класс, в котором содержится метод Main() я назвал KernelModule. Класс сервера ServerModule. Ну, поехали.
В "ядре" сервера создаем глобальную ссылку на наш класс ServerModule

/*http://esate.ru, ProCoder*/

using System;
using System.Net;
using System.Net.Sockets;

namespace EsateGameServer
{
  class KernelModule
  {
    public static ServerModule Server;
    public static void Main()
    {
      
    }
  }
}

А вот код класса ServerModule:

/*http://esate.ru, ProCoder*/

using System;
using System.Net;
using System.Net.Sockets;

namespace EsateGameServer
{
  public class ServerModule
  {
    private TcpListener Server;
    public ServerModule(int Port)
    {
      Server = new TcpListener(IPAddress.Any, Port);
      /*============================================
       * IPAddress.Any указанный вместо IP адреса 
       * компьютера означает, что сервер будет про-
       * слушивать указанный порт на всех интерфей-
       * сах. Например у вас к компьютеру подключен
       * интернет и локальная сеть, а значит сервер
       * будет прослушивать и IP интернет интерфейса
       * по указанному порту, и локальный IP.
       =============================================*/
    }
    
    public void Start()
    {
      Server.Start(); //запускаем слушателя
      while (true) //и в бесконечном цикле..
      {
        TcpClient client = Server.AcceptTcpClient(); //создаем экземпляр TCPClient, и 
                      //направляем ему подключившегося клиента
        Console.WriteLine("Client is connect to the server");
      }
    }
  }
}


В ядре пишем в метод Main() следующие строки:

/*http://esate.ru, ProCoder*/

Server = new ServerModule(256); //Задаем порт 256
Server.Start(); //стартуем

Теперь давайте скомпилируем, и попробуем подключиться к нашему серверу с помощью telnet'а. Открываем консоль, и вводим:

/*http://esate.ru, ProCoder*/

telnet 127.0.0.1 256

Жмем Enter и... в окне telnet'a получаем пустое окно, а в окне нашего сервера получаем сообщение о том, что клиент соединился с сервером. Если так - то отлично! Мы написали простой сервер который прослушивает 256 порт, но, если мы попробуем открыть второе окно telnet'а и присоединиться к нашему серверу, клиент не подключится. И правильно, мы ведь прослушиваем 256 порт в одном потоке, поэтому как только сервер словил клиента он начинает обмен информацией, а про прослушку порта для других клиентов забывает, а значит нам надо сделать сервер многопоточный для одновременной обработки большого количества клиентов. Об этом и многом другом подробнее в следующие части.

Спасибо за внимание, чего непонятно - обращаемся=)
0.2682       2689        27.11.2012        9

Внимание!

Эта публикация перенесена в раздел уроков по адресу Пишем он-лайн игру: Часть первая. Основы.
К ней прикреплена новая отдельная ветка комментариев форума, которую вы можетет найти после текста публикации.
Обсуждение публикации рекуомендуется вести по новому адресу, который указан выше.

0  
27.11.2012 00:00:00
Приятно видеть новые статьи на сайте.
Перенесу в новые уроки и выведу на главную, надеюсь не против?
0  
28.11.2012 00:00:00
Да конечно не против. Сегодня обещаю продолжение.
0  
17.12.2012 00:00:00
А дальше будет?
0  
18.12.2012 00:00:00
Да, в конце месяца сессию сдам, сразу начну писать дальше:)
0  
15.01.2013 00:00:00
Уже середина января=) Когда продолжение?
0  
18.01.2013 00:00:00
Очень хотелось почитать продолжение, так, как на работе будем писать первый сетевой проект.
0  
17.12.2012 00:00:00
0  
03.12.2012 00:00:00
Все понятно описанно, и очень легко освоилось. Продолжай в том же духе!=)
0  
21.01.2013 00:00:00
А не подскажите код, показывающий все ip адреса в локальной сети, как команда arp -a в cmd?
И еще было бы не плохо что нить о broadcast, рассказать)
^