В этой статье я расскажу как в шестом билдере написать свой чат по сети.
Создаем две папки: сервер и клиент.
Для начала создадим сервер. Запустим билдер, создадим новый проект (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
Будут вопросы, обращайтесь!
а как сделать что б по сети работала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/