Несколько дней новогоднего волшебства:
Успейте начать обучение в 2018-ом году со скидкой до 30%!
Выбрать курс

Simple TCP Server на C#

C__Deep_27-5020-75c4e9.09_site.png

Опишу самый простой способ создания TCP-сервера. Это сэкономит время и позволит получить быстрые результаты (я вообще люблю быстрые результаты).

Для создания простого синхронного сервера нам понадобится проект консольного приложения, поэтому использовать многопоточность не потребуется. Консольное приложение необходимо ещё и потому, что используемый код является блокировщиком потоков (thread-blocker). Это значит, что если вы создадите и запустите проект Windows Forms, вы не сможете перемещать и закрывать форму во время работы сервера, что неудобно.

Итак, код размещения ТСР-сервера выглядит следующим образом:

using System;
using System.Text;
using System.Net;      // потребуется
using System.Net.Sockets;    // потребуется
    class Program
    {
        static void Main()
        {
            // устанавливаем IP-адрес сервера и номер порта 1234
            TcpListener server = new TcpListener(IPAddress.Any, 1234);  
            server.Start();  // запускаем сервер
            while (true)   // бесконечный цикл обслуживания клиентов
            {
                TcpClient client = server.AcceptTcpClient();  // ожидаем подключение клиента
                NetworkStream ns = client.GetStream(); // для получения и отправки сообщений
                byte[] hello = new byte[100];   // любое сообщение должно быть сериализовано
                hello = Encoding.Default.GetBytes("hello world");  // конвертируем строку в массив байт

                ns.Write(hello, 0, hello.Length);     // отправляем сообщение
                while (client.Connected)  // пока клиент подключен, ждем приходящие сообщения
                {
                    byte[] msg = new byte[1024];     // готовим место для принятия сообщения
                    int count = ns.Read(msg, 0, msg.Length);   // читаем сообщение от клиента
                    Console.Write(Encoding.Default.GetString(msg, 0, count)); // выводим на экран полученное сообщение в виде строки
                }
            }
        }
    }

Как это работает?

Теперь давайте рассмотрим, как работает эта программа:

  • Мы подключаем для работы пространства имён System.Net и System.Net.Sockets.
  • Мы создаём сервер с помощью класса TcpListener, который будет слушать и принимать подключения с любого IP-адреса на указанном порту.:
TcpListener server = new TcpListener(IPAddress.Any, 1234);
  • Следующей строкой мы ожидаем и принимаем подключение от ТСР-клиента:
while (true)
{
       TcpClient client = server.AcceptTcpClient();
       ...
}
  • Клиент подключился и мы хотим отправить ему сообщение через NetworkStream. Однако мы не можем напрямую отправлять и получать строчки. Сообщение необходимо трансформировать в массив байт:
Encoding.Default.GetBytes("hello world");
  • Отправляем полученный массив байт через NetworkStream:
NetworkStream ns = client.GetStream();
ns.Write(hello, 0, hello.Length);
  • Осталось получить сообщение от клиента — оно приходит в виде массива байт через тот же NetworkStream:
ns.Read(msg, 0, msg.Length);
  • Осталось трансформировать массив в текстовую строчку и вывести её на экран:
Console.WriteLine(Encoding.Default.GetString(msg).Trim());

Как видите, всё довольно просто.

Сервер принимает только одного клиента. Почему?

Если мы внимательно посмотрим на исходник, всё становится понятно. Однако давайте всё же рассмотрим этот момент подробнее.

У нас есть ТСР-клиент, который подключается к нашему серверу и отправляет данные. Пока client.Connected возвращает true, сервер будет заблокирован ожиданием новых сообщений и не сможет проверять/принимать новых ТСР-клиентов. Обычно этот вопрос решается созданием отдельных потоков для каждого подключённого клиента либо созданием асинхронного сервера, однако эти методы выходят за рамки нашей заметки.

Для проверки работы программы вы можете использовать Telnet, доступный в любой системе Windows. Для этого перейдите в командную строку и введите: telnet 127.0.0.1 1234. Если вы увидите сообщение “hello world”, напишите что-нибудь в ответ и нажмите Ctrl ].

На этом пока всё. Если хотите узнать больше о создании ТСР-серверов, записывайтесь на курс Разработчик игр на С#. Подробно рассмотрим технологии создания клиент-серверного приложения и разработаем онлайн-игру для мобильных телефонов.

Есть вопрос? Напишите в комментариях!

Автор
0 комментариев
Для комментирования необходимо авторизоваться