Создание сетевого чата на C++ Builder 6

В этой статье я расскажу как в шестом билдере написать свой чат по сети.

Создаем две папки: сервер и клиент.

Для начала создадим сервер.  Запустим билдер,  создадим новый проект (File->New->Application).  Сразу сохраним его в папку «сервер». Добавляем на формы следующие компоненты и изменяем свойства:

  • Label1 — В свойстве Caption пишем «Порт»
  • Edit1 — В свойстве Text пишем «5648», это будет наш порт для подключения, можно задать любой другой.
  • Button1 — В свойстве Caption пишем «Создать»
  • Memo1 — В свойстве Lines удаляем все строки
  • Edit2 — В свойстве Text стираем все символы
  • Button2 — В свойстве Caption пишем «Отправить»
  • ServerClient1 — Ничего не меняем


Теперь необходимо переименовать наши компоненты,  для этого изменяем свойство «Name»:

  • Label1 — Оставим как есть
  • Edit1 -> EditPort
  • Button1 -> ButtonStart
  • Memo1 -> MemoMessages
  • Edit2 -> EditMessage
  • Button2 -> ButtonSend
  • ServerClient1 -> ServerClient
  • Form1 -> FormMain

Все компоненты аккуратно расставили, и теперь начинаем писать код. Дважды щелкаем по кнопке «Создать», пешем следующий код:

EditPort->Enabled = false; //Отключаем поле ввода порта
ButtonStart->Enabled = false; //Отключаем кнопку запуска
ServerSocket->Port = EditPort->Text.ToInt(); //Задаем серверу порт
ServerSocket->Active = true; //Включаем сервер

Далее нам необходимо написать функцию рассылки сообщений, ее нужно писать после функции __fastcall TFormMain::TFormMain(TComponent* Owner). Код:

void TFormMain::SendingMessages(AnsiString Message) //Функция рассылки сообщений
{
  MemoMessages->Lines->Add(Message); //Вывод сообщения на экран
  for(int i = 0; i < ServerSocket->Socket->ActiveConnections; i++) //Цикл перебирает всех подключенных
  {
    ServerSocket->Socket->Connections[i]->SendText(Message); //Рассылка сообщений
  }
}

Кстати еще в .h файле в разделе private необходимо написать void SendingMessages(AnsiString Message);

Вернемся на форму, выберем у ServerSocket обработчик OnClientRead в вкладке Events, щелкаем два раза, пишем код:

SendingMessages(Socket->ReceiveText()); //Читаем сообщения и рассылаем их через функцию SendingMessages()

Щелкаем два раза по кнопке отправить, пишем код:

SendingMessages("Сервер: " + EditMessage->Text); //Рассылаем сообщение через функцию SendingMessages()

И последнее, выберем у формы обработчик OnClose и впишем в него:

ServerSocket->Active = false; //При закрытии формы отключаем сервер

Компилируем, сервер готов.

Теперь напишем клиент. Создаем новый проект (File->New->Application).  Сразу сохраним его в папку «клиент». Добавляем на формы следующие компоненты и изменяем свойства:

  • Label1 — В свойстве Caption пишем «Порт»
  • Label2 — В свойстве Caption пишем «Хост»
  • Label3 — В свойстве Caption пишем «Ник»
  • Edit1 — В свойстве Text пишем «5648», это будет наш порт для подключения, можно задать любой другой.
  • Edit2 — В свойстве Text пишем «127.0.0.1»
  • Edit2 — В свойстве Text пишем «Гость»
  • Button1 — В свойстве Caption пишем «Подключиться»
  • Memo1 — В свойстве Lines удаляем все строки
  • Edit2 — В свойстве Text стираем все символы
  • Button2 — В свойстве Caption пишем «Отправить»
  • ServerSocket1 — Ничего не меняем 🙂

Теперь необходимо переименовать наши компоненты,  для этого изменяем свойство «Name»:

  • Label1 -> Оставим как есть
  • Label2 -> Оставим как есть
  • Label3 -> Оставим как есть
  • Edit1 -> EditPort
  • Edit2 -> EditHost
  • Edit2 -> EditName
  • Button1 -> ButtonConnect
  • Memo1 -> MemoMessages
  • Edit2 -> EditMessage
  • Button2 -> ButtonSend
  • ServerSocket1 -> ServerSocket

Пишем код для компонентов, начнем с кнопки «Подключиться»:

EditPort->Enabled = false; //Отключаем поле ввода порта
EditHost->Enabled = false; //Отключаем поле ввода хоста
EditName->Enabled = false; //Отключаем поле ввода ника
ButtonConnect->Enabled = false; //Отключаем кнопку подключения
ClientSocket->Port = EditPort->Text.ToInt(); //Задаем клиенту порт для подключения
ClientSocket->Host = EditHost->Text; //Задаем клиенту хост для подключения
ClientSocket->Active = true; //Включаем клиента

Кнопка «Отправить»:

ClientSocket->Socket->SendText(EditName->Text + ": " + EditMessage->Text); //Отсылаем на сервер ник и сообщение

Обработчик OnRead у компонента ClientSocket:

MemoMessages->Lines->Add(Socket->ReceiveText()); //Выводим на экран принятое сообщение

Обработчик OnClose у формы:

ClientSocket->Active = false; //При закрытии формы отключаем клиента

Все, клиент тоже готов. Компилируем…
Теперь можем проверить работоспособность нашего чата, для этого сначала запускаем сервер, жмем «создать». Затем запускаем клиент, жмем «Соединиться». Пробудем писать, сообщения должны отсылаться и отображаться в каждом окне.

Исходник: sozdanie-setevogo-chata-na-c-builder-6.zip

Будут вопросы, обращайтесь!

Rating: 4.61/5. From 23 votes.
Please wait...

Comments

  1. а как сделать что б по сети работала7

    0
    Be the first one to like this.
    Please wait...
    1. ден, на одном компе запускаешь сервер, на другом клиента. В клиенте указываешь ip сервера и подключайся. Все должно работать…

      0
      Be the first one to like this.
      Please wait...
  2. Здоровски, спасибо тебе) Интересно))

    0
    Be the first one to like this.
    Please wait...
  3. Я когда запускаю сервер или клиент мне пишет что отсутствует vcl60.bpl

    0
    Be the first one to like this.
    Please wait...
    1. Грант, на компьютере должен быть установлен C++ Builder 6. В будущем приложение можно скомпилировать для запуска даже без установленного Builder’a.

      0
      Be the first one to like this.
      Please wait...
  4. ОГРОМНОЕ спасибо, очень просто и доходчиво. Безмерно благодарен, продолжай в том же духе))

    0
    Be the first one to like this.
    Please wait...
  5. а как сделать чат без сервера, чтобы говорили только 2 клиента ???

    0
    Be the first one to like this.
    Please wait...
    1. Яша, а смысл в этом? Без сервера не получится. Но можно запустить у одного человека сервер, у второго клиента и общаться. В серверуню часть так же встроен чат.

      0
      Be the first one to like this.
      Please wait...
  6. хочу сделать прогу чтобы разговаривали люди по сети, чтобы 2 человека говорили между собой и в тоже время штобы другие могли говорить между собой. Это возможна ???

    0
    Be the first one to like this.
    Please wait...
    1. Яша, это возможно и через этот чат. Один человек запускает сервер, другой клиент и общаются между собой. Сделедующие 2 человека делают тоже самое только указывают другой порт, к примеру на еденицу больше от предыдущего.

      0
      Be the first one to like this.
      Please wait...
  7. А можно использовать эти же компоненты (ServerSocket и ClientSocket) для передачи данных, некоторые данные из таблицы в таблицу например?

    0
    Be the first one to like this.
    Please wait...
    1. Metrix, конечно можно. Главное продумать реализацию этой передачи.

      0
      Be the first one to like this.
      Please wait...
  8. Понял, спасибо, еще один маленький вопрос, эти компоненты единственные в своем роде или есть еще похожие на них компоненты?

    0
    Be the first one to like this.
    Please wait...
    1. Metrix, есть и другие. Но с ними не знаком. Гугл в помощь 🙂

      0
      Be the first one to like this.
      Please wait...
  9. Ну это как всегда))))Спасибо большое, хорошие уроки)))

    0
    Be the first one to like this.
    Please wait...
  10. Надеюсь будут еще))

    0
    Be the first one to like this.
    Please wait...
  11. Дружище, а можно с тобой как-то связаться? У меня не выходит соединение по ip, замучался уже — ни одно решение не помогло. vkid — oliverjg, заранее спасибо

    0
    Be the first one to like this.
    Please wait...
  12. Можно ли сделать чтобы автоматически вписывался хост у клиентв, если я не знаю на каком компютере запущен сервер

    0
    Be the first one to like this.
    Please wait...
    1. Я впринципе понимаю глупость вопроса, но задача просто такая: человек, неизвестно кто, запускает сервер, и остальные кто нажимают подключится с программы клиент, они подключались к этому серверу

      0
      Be the first one to like this.
      Please wait...
      1. Иван, да, и правда немного глупая задумка как мне кажется. Но я думаю это осуществимо. Просто программе-клиенту придется сканировать всю подсеть в поисках сервера.

        0
        Be the first one to like this.
        Please wait...
        1. Привет, не мог бы ты отправить полностью код

          0
          Be the first one to like this.
          Please wait...
          1. polded, все есть в статье, даже исходники прикрепленны.

            0
            Be the first one to like this.
            Please wait...
            1. отправьте пожалуйста если не трудно весь код буду очень признателен. Я имею ввиду со всеми директивами На пример :

              #include
              #pragma hdrstop

              #include «Main.h»
              #include «About.h»
              #include «settingsform.h»

              ….

              0
              Be the first one to like this.
              Please wait...
  13. Мне он для курсовой работы нужен,код полностью нужен, вроде обрезки есть, но по факту нужен полностью код к курсовой, был бы признателен тебе если бы отправил бы.

    0
    Be the first one to like this.
    Please wait...
    1. polded, выслал на почту

      0
      Be the first one to like this.
      Please wait...
      1. мне отправишь?

        0
        Be the first one to like this.
        Please wait...
        1. 1337, в статье есть ссылка. Все читаем внимательно.

          0
          Be the first one to like this.
          Please wait...
  14. Привет. Подскажи пожалуйста. Даю другу, что бы не по локалке, а именно по инету, у него ошибка 10060. В чем загвоздка может быть?

    0
    Be the first one to like this.
    Please wait...
    1. Денис, в том и загвоздка что «не по локалке». Это программа для локальной сети. В глобальной сети ее можно использовать только в случае если оба компа имеют белые IP и подключены без всяких роутеров на пути, ну или настроен проброс портов.

      0
      Be the first one to like this.
      Please wait...
  15. А возможно как то настроить программу, может быть там чуть по другому переписать, что бы на обеих сторонах с роутерами, да и скорее всего с серыми IP работало?
    Может быть с другими компонентами какими то..
    Подскажи пожалуйста хотя бы технологию 🙂

    0
    Be the first one to like this.
    Please wait...
  16. Спасибо за подробное обьяснение http://libixur.ru/

    0
    Be the first one to like this.
    Please wait...

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *