Загрузка...

Building a simple client-server application

Thread in C# created by SijyKijy Aug 20, 2018. 321 view

  1. SijyKijy
    SijyKijy Topic starter Aug 20, 2018 Сгнил 34 Mar 10, 2017
    Всем привет. Сильно огромное вступление делать не буду, поэтому давайте сразу к теме.

    Целью нашего проекта будет простая отправка сообщения с клиента на сервер и последующим выводом этого сообщения на экране сервера. Ну что ж, поехали!

    КЛИЕНТ

    Для начала создадим консольный проект в нашей IDE (Я использую visual studio 2017). Думаю как это сделать вам не стоит рассказывать.
    Дальше нам нужно создать объект класса Socket, этот класс как раз и предоставляет все средства для сетевого взаимодействия в c#. Для его использования нам нужно будет подключить пространство [System.Net.Sockets].

    [IMG]
    Чтобы закончить создание объекта, нам нужно использовать один из его конструкторов. В этом примере мы будем работать с протоколом TCP, поэтому заполняем по следующим образом:
    Code
    Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    Для каждого протокола свои вариации параметров. Вот ещё пример для UDP:
    Code
    Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    Я не буду подробно объяснять что такое AddressFamily, SocketType и т.д. Если вам очень интересно, то можете без проблем найти это в гугле.
    Итак, мы создали сокет. Дальше нам нужен какой-то массив байтов (буфер). Напрашивается вопрос: "Зачем, чёрт возьми, он нам нужен?". Весь прикол вот, что в сетевом взаимодействии обмен информацией происходит в байтах. То есть в нашем случае нам нужно преобразовать строку в некую последовательность байтов и отправить её на сервер. Так чего же мы ждём?
    Для начала создадим буфер, затем запросим у пользователя ввод строки, преобразуем её в байты и запишем в наш буфер:

    [IMG]
    Дальше нам нужно будет отправить наше сообщение. Для того чтобы это сделать, нам нужно подключиться к нашему серверу с помощью метода connect(). У него есть одна простая перегрузка, которая позволит сразу ввести в параметрах ip и порт нашего сервера. Т.к. я буду подключаться к себе, то ip будет 127.0.0.1, а порт 666 (Привет id Software!!! ^-^). Затем мы просто с помощью метода send() передаём в параметры наш буфер и отправляем байты на сервер, а так же закрываем подключение (Мы же только один раз отправляем сообщение).
    [IMG]

    СЕРВЕР

    Переходим к серверу, нам же нужно принимать наше коварное сообщение, ведь так? Для начала нам нужно сокет, но мы парни продвинутые и знаем как создавать его! (Да?).

    Дальше нужно привязать наш сервер к определённому ip. Делается это через метод Bind(). Заметьте, мы не можем напрямую вписать IP и порт, нам создать объект класса IPEndPoint, который относится к пространству имён System.Net и в его конструкторе вписать IPAddress.Any (Позволяет использовать любой доступный IP на нашем компьютере) и порт, который мы указывали при создании клиента.
    После, с помощью метода Listen(), ставим ограничение на максимальное кол-во входящих подключений, которое может обработать сервер. Тут будет число, подключений, которые могут быть поставлены в очередь сокета. Ну и нам нужно получать запросы от клиентов. Это делается через метод Accept().
    [IMG]
    Дальше, самое интересное, нам нужно принимать информацию от клиента. Делаем это через метод Recive(), но как вы заметили/подумали, то нам нужно куда-то записывать эту информацию. Т.к. это поток байтов, то нам вновь нужен буфер, создадим его.

    [IMG]
    Ну и наконец декодируем наше сообщение и выводим его на экран сервера.

    [IMG]

    Запускаем сначала сервер, затем клиент.

    [IMG]
    [IMG]
    Как видите всё работает. Знаю, что тут можно улучшить всё исключениями, добавить сообщения о заходе, красиво оформить, но этот код был написал в ознакомительных целях и я старался сделать его максимально коротким.
    Спасибо за внимание.

    Код из урока (ТЫК)
     
  2. San32_inactive330533
    Респект автору. Очень информативная статья. Лучшее, что я прочитал за последнее время
     
  3. B4rt
    B4rt Aug 20, 2018 вечный студент 526 Sep 9, 2017
    Гуд братик
     
  4. Lenzy
    Lenzy Aug 20, 2018 sold 116 Mar 8, 2018
    че за хуйня
     
  5. SijyKijy
    SijyKijy Topic starter Aug 21, 2018 Сгнил 34 Mar 10, 2017
    Lenzy, В теме написано же
     
  6. fantik22
    Респект, но как по мне сервер лучше писать на php/python
     
  7. Nol1k
    Nol1k Aug 21, 2018 Проверенный 226 Jan 4, 2017
    Пиши лучше на библиотеках Qt, там такой же Socket, просто легче.
     
Loading...
Top