В этой статье я расскажу как в шестом билдере написать свой чат по сети.
Создаем две папки: сервер и клиент.
Для начала создадим сервер. Запустим билдер, создадим новый проект (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
Все компоненты аккуратно расставили, и теперь начинаем писать код. Дважды щелкаем по кнопке «Создать», пешем следующий код:
1 2 3 4 |
EditPort->Enabled = false; //Отключаем поле ввода порта ButtonStart->Enabled = false; //Отключаем кнопку запуска ServerSocket->Port = EditPort->Text.ToInt(); //Задаем серверу порт ServerSocket->Active = true; //Включаем сервер |
Далее нам необходимо написать функцию рассылки сообщений, ее нужно писать после функции __fastcall TFormMain::TFormMain(TComponent* Owner). Код:
1 2 3 4 5 6 7 8 |
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, щелкаем два раза, пишем код:
1 |
SendingMessages(Socket->ReceiveText()); //Читаем сообщения и рассылаем их через функцию SendingMessages() |
Щелкаем два раза по кнопке отправить, пишем код:
1 |
SendingMessages("Сервер: " + EditMessage->Text); //Рассылаем сообщение через функцию SendingMessages() |
И последнее, выберем у формы обработчик OnClose и впишем в него:
1 |
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
Пишем код для компонентов, начнем с кнопки «Подключиться»:
1 2 3 4 5 6 7 |
EditPort->Enabled = false; //Отключаем поле ввода порта EditHost->Enabled = false; //Отключаем поле ввода хоста EditName->Enabled = false; //Отключаем поле ввода ника ButtonConnect->Enabled = false; //Отключаем кнопку подключения ClientSocket->Port = EditPort->Text.ToInt(); //Задаем клиенту порт для подключения ClientSocket->Host = EditHost->Text; //Задаем клиенту хост для подключения ClientSocket->Active = true; //Включаем клиента |
Кнопка «Отправить»:
1 |
ClientSocket->Socket->SendText(EditName->Text + ": " + EditMessage->Text); //Отсылаем на сервер ник и сообщение |
Обработчик OnRead у компонента ClientSocket:
1 |
MemoMessages->Lines->Add(Socket->ReceiveText()); //Выводим на экран принятое сообщение |
Обработчик OnClose у формы:
1 |
ClientSocket->Active = false; //При закрытии формы отключаем клиента |
Все, клиент тоже готов. Компилируем…
Теперь можем проверить работоспособность нашего чата, для этого сначала запускаем сервер, жмем «создать». Затем запускаем клиент, жмем «Соединиться». Пробудем писать, сообщения должны отсылаться и отображаться в каждом окне.
Исходник: sozdanie-setevogo-chata-na-c-builder-6.zip
Будут вопросы, обращайтесь!
а как сделать что б по сети работала7
ден, на одном компе запускаешь сервер, на другом клиента. В клиенте указываешь ip сервера и подключайся. Все должно работать…
Здоровски, спасибо тебе) Интересно))
Я когда запускаю сервер или клиент мне пишет что отсутствует vcl60.bpl
Грант, на компьютере должен быть установлен C++ Builder 6. В будущем приложение можно скомпилировать для запуска даже без установленного Builder’a.
ОГРОМНОЕ спасибо, очень просто и доходчиво. Безмерно благодарен, продолжай в том же духе))
а как сделать чат без сервера, чтобы говорили только 2 клиента ???
Яша, а смысл в этом? Без сервера не получится. Но можно запустить у одного человека сервер, у второго клиента и общаться. В серверуню часть так же встроен чат.
хочу сделать прогу чтобы разговаривали люди по сети, чтобы 2 человека говорили между собой и в тоже время штобы другие могли говорить между собой. Это возможна ???
Яша, это возможно и через этот чат. Один человек запускает сервер, другой клиент и общаются между собой. Сделедующие 2 человека делают тоже самое только указывают другой порт, к примеру на еденицу больше от предыдущего.
А можно использовать эти же компоненты (ServerSocket и ClientSocket) для передачи данных, некоторые данные из таблицы в таблицу например?
Metrix, конечно можно. Главное продумать реализацию этой передачи.
Понял, спасибо, еще один маленький вопрос, эти компоненты единственные в своем роде или есть еще похожие на них компоненты?
Metrix, есть и другие. Но с ними не знаком. Гугл в помощь 🙂
Ну это как всегда))))Спасибо большое, хорошие уроки)))
Надеюсь будут еще))
Дружище, а можно с тобой как-то связаться? У меня не выходит соединение по ip, замучался уже — ни одно решение не помогло. vkid — oliverjg, заранее спасибо
Можно ли сделать чтобы автоматически вписывался хост у клиентв, если я не знаю на каком компютере запущен сервер
Я впринципе понимаю глупость вопроса, но задача просто такая: человек, неизвестно кто, запускает сервер, и остальные кто нажимают подключится с программы клиент, они подключались к этому серверу
Иван, да, и правда немного глупая задумка как мне кажется. Но я думаю это осуществимо. Просто программе-клиенту придется сканировать всю подсеть в поисках сервера.
Привет, не мог бы ты отправить полностью код
polded, все есть в статье, даже исходники прикрепленны.
отправьте пожалуйста если не трудно весь код буду очень признателен. Я имею ввиду со всеми директивами На пример :
#include
#pragma hdrstop
#include «Main.h»
#include «About.h»
#include «settingsform.h»
….
Мне он для курсовой работы нужен,код полностью нужен, вроде обрезки есть, но по факту нужен полностью код к курсовой, был бы признателен тебе если бы отправил бы.
polded, выслал на почту
мне отправишь?
1337, в статье есть ссылка. Все читаем внимательно.
Привет. Подскажи пожалуйста. Даю другу, что бы не по локалке, а именно по инету, у него ошибка 10060. В чем загвоздка может быть?
Денис, в том и загвоздка что «не по локалке». Это программа для локальной сети. В глобальной сети ее можно использовать только в случае если оба компа имеют белые IP и подключены без всяких роутеров на пути, ну или настроен проброс портов.
А возможно как то настроить программу, может быть там чуть по другому переписать, что бы на обеих сторонах с роутерами, да и скорее всего с серыми IP работало?
Может быть с другими компонентами какими то..
Подскажи пожалуйста хотя бы технологию 🙂
Спасибо за подробное обьяснение http://libixur.ru/