Чат на c клиент сервер

Чат на c клиент сервер

MyChat — мощный клиент-серверный чат для локальной сети и Интернета. Идеально подходит для обмена сообщениями и файлами в корпоративных и офисных сетях.

MyChat — отличный инструмент для организации собственного корпоративного мессенджера на предприятии.

SSL шифрование передаваемых сообщений, система массового оповещения, доска для объявлений, гибкое управление пользователями, древовидный список контактов.

WEB-чат для размещения на сайте и общения посетителей с вашими сотрудниками.

Аудио и видео чат — вы можете звонить в чате и общаться, используя обычные голосовые звонки или видео вызовы.

Контроль задач и поручений для сотрудников в виде доски Kanban.

Вы хотите протестировать MyChat и не готовы сейчас покупать лицензию?

Или предпочитаете использовать только бесплатные программы?

Тогда установите бесплатную версию:

У вас нет подходящего компьютера для сервера чата?

Нет внешнего "белого" IP адреса или он динамический?

Нет возможности самостоятельно заниматься обслуживанием сервера?

Напишем более менее осмысленную программу — консольный tcp-чат.

Вначале создадим консольный проект сервера, который назовем ChatServer. В этот проект добавим два новых класса ClientObject и ServerObject . Класс ClientObject будет выглядеть так:

У объекта ClientObject будет устанавливаться свойство Id, которое будет уникально его идентифицировать, и свойство Stream, хранящее поток для взаимодействия с клиентом. При создании нового объекта в конструкторе будет происходить его добавление в коллекцию подключений класса ServerObject, который мы далее создадим:

Основные действия происходят в методе Process() , в котором реализован простейший протокол для обмена сообщениями с клиентом. Так, в начале получаем имя подключенного пользователя, а затем в цикле получаем все остальные сообщения. Для трансляции этих сообщений всем остальным клиентам будет использоваться метод BroadcastMessage() класса ServerObject.

Класс ServerObject будет выглядеть таким образом:

Читайте также:  Ноутбук lenovo прошивка bios

Все подключенные клиенты будут храниться в коллекции clients. С помощью методов AddConnection и RemoveConnection мы можем управлять добавлением / удалением объектов из этой коллекции.

Основной метод — Listen() , в котором будет осуществляться прослушивание всех входящих подключений. При получении подключения будет запускаться новый поток, в котором будет выполняться метод Process объекта ClientObject.

Для передачи сообщений всем клиентам, кроме отправившего, предназначен метод BroadcastMessage() .

Таким образом разделяются сущность подключенного клиента и сущность сервера.

Теперь надо запустить прослушивание в основном классе программы. Для этого изменим класс Program:

Здесь просто запускается новый поток, который обращается к методу Listen() объекта ServerObject.

Теперь создадим новый консольный проект для клиента, который назовем ChatClient. Изменим его стандартный класс Program следующим образом:

Чтобы не блокировать ввод сообщений в главном потоке, для получения сообщений создается новый поток, который обращается к методу ReceiveMessage.

С# настолько же дурацкий язык, насколько и простой. А простой он настолько, что чат на несколько персон с минимальной защитой пишется в нем за пятнадцать, ну, максимум тридцать минут. У нас это заняло чуть более двух суток, но тут уже проблема дураков, а не инструментов.

Оформим задачу: мы хотим сделать децентрализованный групповой чат с некой защитой. Для такой «крупной» задачи нам понадобится всего ничего: C# (можно даже использовать неправославный MonoDevelop) с его прекраснейшим .NET Framework’ом.

Сначала напишем часть отправки и приема сообщений. Проблема состоит в том, что нужно как-то разобраться с отправкой сообщений нескольким клиентам. Это сделать довольно сложно, незнакомым с сетями в голову сразу приходят всякие грязные мысли а-ля: хранить все айпишники, которые когда-либо присылали на сообщения, или там организовать какой-нибудь хитрый граф между пользователями. Как обычно, проблема решается, если посмотреть на нее со стороны: а зачем нам использовать TCP, когда есть UDP?

Читайте также:  Как сбросить планшет prestigio до заводских настроек

После совсем уж тщетных попыток наладить хоть какое-нибудь многопользовательское взаимодействие через TCP, мною был выбран второй вариант, и все оказалось очень простым – в UDP есть отдельные группы, и участники не могут так просто отправить сообщение какому-то отдельному участнику группы. Если сообщение отсылается, оно отсылается всем участникам группы – то что нужно для нас. Сделаем класс Chat, в котором будут следующие поля и методы:

Для полей UdpClient, IPAddress и IPEndPoint подключим библиотеки System.Net.Sockets и System.Net
Ну и конструкторы-деструкторы само-собой. В конструкторе будем инициализировать поле udpclient:

В деструкторе пока ничего не будем делать – Garbage collector же.
Теперь главное — SendMessage и Listen. SendMessage будет отправлять UTF8 представление строки, и тут нам опять на помощь приходит C#, в котором получить байтовое представление можно в одну строчку:

В методе Listen мы просто запустим отдельный поток на том же адресе и порте, через который мы отправляем сообщения, который будет получать байты, расшифровывать их, и писать их в общую консоль:

С обменом сообщений теперь покончено. Шифрование прикручивается еще проще: для него нам придется попросить у пользователя ключ при создании объекта чата, добавить методы шифрования дешифрования, отправлять в группу строку после обработки методом шифрования, а выводить после дешифрования. Делов то.

Теперь нужно немного изменить методы SendMessage и Listen, добавив туда шифрование и дешифрование. Довольно тривиально, на мой взгляд.

Теперь финальный шаг — функция main. В ней мы будем запускать один поток, так что нам понадобится System.Threading;
С дополнительным потоком все реализуется буквально в четыре строчки:

Все, простейший обмен сообщениями мы написали. К нему можно допилить обмен сообщениями в бесконечном цикле, никнеймы, историю сообщений, настройки, окошки — много чего, но это уже можно отнести к другой статье.

Ссылка на основную публикацию
Хороший принтер для школьника
Для ученика возможность распечатывать доклады, рефераты и иллюстрации для занятий в школе - совсем не лишняя. Школьнику в XXI веке...
Файл с расширением dav чем открыть
Файл формата DAV открывается специальными программами. Чтобы открыть данный формат, скачайте одну из предложенных программ. Чем открыть файл в формате...
Файл подкачки windows 7 на флешку
В прошлой статье рассказано, как определиться с оптимальным размером файла подкачки, что делать с SSD-дисками и как установить размер файла...
Хороший телефон с aliexpress
Обновлено 22.10.2019 На Алиэкспресс есть много разных производителей смартфонов. Даже есть такие международные бренды, как Apple. В этой подборке мы...
Adblock detector