> For the complete documentation index, see [llms.txt](https://nas-3.gitbook.io/nasdatabase/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://nas-3.gitbook.io/nasdatabase/database/databaseapi-fast-start/kliet-server-programma.md).

# Клиет-Сервер программа

NASDataBase предоставляет возможность создать Client-Server программы. Это может пригодится при разработки программ для потребителей или же создания сайтов.

&#x20;**!Пример указанный здесь не подойдет для больших проектов так как тут не указан пример защиты от атак и подделки команд!**

### Начало

Создайте 2 программы: клиентскую и сервера. На сервере необходимо инициализировать `Database` \
и создать экземпляр класса наследника от класса `DatabaseServer` , который будет уже работать с сетью.&#x20;

{% tabs %}
{% tab title="DataBase" %}

<pre class="language-csharp"><code class="lang-csharp">var DBM = new DatabaseManager();
Database DB;
string path = "[твой путь]";
<strong>
</strong><strong>//Загрузка базы
</strong><strong>try
</strong>{
     DB = DBM.LoadDB(path, <a data-footnote-ref href="#user-content-fn-1">LoadKey</a>($"{path}\\Key"), 1);
}
catch
{
     DB = DBM.CreateDatabase(new DatabaseSettings("[название]", "[часть пути]", 2));
     <a data-footnote-ref href="#user-content-fn-2">SaveKey</a>(DB.Settings.Key, path + "\\Key");
}

//Создание экземпляра DBServer с протаколом отправки команд
//BaseServerCommandPusher
DB.Server = new DBServer&#x3C;BaseServerCommandPusher>
(new ServerSettings("127.0.0.1", 6666, "NAS"), DB);

DB.Server.InitServer();//Запуск сервера
</code></pre>

{% endtab %}

{% tab title="FasterDataBase" %}

<pre class="language-csharp"><code class="lang-csharp">var DBM = new DatabaseManager();
FasterDatabase DB;
string path = "[твой путь]";

//Загрузка базы
try
{
     DB = DBM.LoadDB&#x3C;FasterDatabase>(path, <a data-footnote-ref href="#user-content-fn-3">LoadKey</a>($"{path}\\Key"), 1);
}
catch
{
     DB = DBM.CreateDatabase&#x3C;FasterDatabase>(new DatabaseSettings("[название]", "[часть пути]", 2));
     <a data-footnote-ref href="#user-content-fn-4">SaveKey</a>(DB.Settings.Key, path + "\\Key");
}

//Создание экземпляра DBServer с протаколом отправки команд
//BaseServerCommandPusher
DB.Server = new DBServer&#x3C;BaseServerCommandPusher>
(new ServerSettings("127.0.0.1", 6666, "NAS"), DB);

DB.Server.InitServer();//Запуск сервера
</code></pre>

{% endtab %}
{% endtabs %}

Как видно из кода на сервере, нужно загрузить базу и вызвать у `Server` метод `InitServer` . &#x20;

{% tabs %}
{% tab title="Client" %}

```csharp
Client client = new Client("Client", "NAS");//Имя клиента и ключ подключения 
client.ConnectTo<ClientCommandsWorker>("127.0.0.1", 6666);//ip и port подключения
```

{% endtab %}
{% endtabs %}

Код клиента проще, как можно увидеть всего две строчки, где указывается IP и Port сервера куда нужно подключиться.&#x20;

Далее можно спокойно взаимодействовать с `client` как с обычным экземпляром `Database`. Вы можете добавлять данные или же получать их делая запросы через методы класса.&#x20;

{% tabs %}
{% tab title="Client" %}

```csharp
for(; ;)
{
    Console.WriteLine("---------------------------");
    Console.Write("name >>");
    var d1 = Console.ReadLine();
    Console.Write("old >>");
    var d2 = Console.ReadLine();

    try
    {
        client.AddData(d1, d2);
    }
    catch (Exception ex)
    {
        Console.ForegroundColor = ConsoleColor.Red;
        Console.WriteLine(ex.Message);
        Console.ResetColor();
    }
}
```

{% endtab %}
{% endtabs %}

В представленном коде показан вариант взаимодействия с базой данных через клиентский интерфейс. Пользователь должен предоставить информацию о имени и возрасте, которая затем отправляется на сервер. На сервере же вы можете проводить дополнительные операции с этими данными(подробнее см. [fast start](/nasdatabase/database/databaseapi-fast-start.md)).&#x20;

[^1]: Ваш метод загрузки ключа от базы

[^2]: Ваш метод сохранения ключа от базы

[^3]: Ваш метод для загрузки ключа

[^4]: Ваш метод для сохранения ключа
