Создание простого клиент-сервер приложения (C#)

Starkark

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

КЛИЕНТ

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




Чтобы закончить создание объекта, нам нужно использовать один из его конструкторов. В этом примере мы будем работать с протоколом TCP, поэтому заполняем по следующим образом:

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



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



СЕРВЕР

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


Дальше, самое интересное, нам нужно принимать информацию от клиента. Делаем это через метод Recive(), но как вы заметили/подумали, то нам нужно куда-то записывать эту информацию. Т.к. это поток байтов, то нам вновь нужен буфер, создадим его.


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



СПОЙЛЕР: РЕЗУЛЬТАТ

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