PDA

Просмотр полной версии : Чат на двоих [Delphi]


_GlaD1aT(OR)_
27.07.2008, 08:37
Создание чата при помощи Delphi
Сейчас ты узнаешь, как создать простейший чат на два пользователя. Его можно использовать в обмене важными данными, т.к. есть вероятность, что на твоем компе установлен какой-нибудь троян ICQ, и вся история icq ежедневно отправляется злоумышленнику, а на этот чат Troяn не залезит, разве что у тебя нет клавиатурного шпиона который делает скриншоты твоего экрана :D. Так, думаю ты уже включил Delphi (Я использовал Delphi7) и создал новый проэкт, если нет, то сделай это, если да, то давай приступим к созданию сетевого чата на двоих :).
Основные два компонента для реализации чата, это ServerSocket и ClientSocket. Эти компоненты находятся на вкладке Internet … по умолчанию их там нет, но их легко туда поместить выбрать в меню: Component - Install Package, там нажать на кнопку Add и далее указать путь …\bin\dclsockets70.bpl.
Так я уже говорил, этот проект представляет собой чат на двоих пользователей. Думаю теперь можно приступить к форме и накидать туда компоненты. Ну во-первых нам понадобятся компоненты ServerSocket и ClientSocket со вкладке Internet, кинем в форму 4 Edit’a, первый назовем Port, вторую Edit-форму назовем Host (понадобиться нам это, потому что для соединения с сервером необходимо указывать IP сервера), третью форму назовем Name (поле для ника) и последнею форму назовем Send (поле для отправки сообщения), также кинем на форму Memo ( Текст сообщений будет отображаться в), я его так и назвал Memo. Также установим вертикальную полосу прокрутки: ScrollBars (на панели Object Inspector поставить ssVertical, и свойство ReadOnly - True. Также добавим 3 кнопки ServerOn (открыть, создать сервер), Client (клиен), SendText (отправка сообщений) и ServerOff (закрыть сервер). Изменим название клавиш на “Создать сервер”, “Подключиться” и “Отправить”. Для красоты чата можно добавить несколько Label-форм, можно и картинку подставить.

Теперь непосредственно перейдем к самому коду программы, сначала опишем процедуру OnCreate:

procedure TForm1.FormCreate(Sender: TObject);
begin
Port.Text:='777';
// при проверке программы на одном ПК
Host.Text:='127.0.0.1';
Name.Text:='NickName';
// поле Memo и Send просто очистим
Send.Clear;
Memo.Lines.Clear;
//блокируем клавишу Закрыть сервер
ServerOff.Enabled:=Fasle;
end;

Переход программы в режим сервера будет осуществляется клавишей "Создать сервер" (ServerOn):

procedure TForm1.ServerOnClick(Sender: TObject);
Begin
// клавишу Client, ServerOn и поля Host, Port надо заблокировать,
// а ServerOff разблокировать соответственно
ServerOn.Enabled:=False;
Client.Enabled:=False;
Host.Enabled:=False;
Port.Enabled:=False;
ServerOff.Enabled:=True;
// запишем указанный порт в ServerSocket
ServerSocket.Port:=StrToInt(Port.Text);
// создание сервер
ServerSocket.Active:=True;
// добавим в Memo сообщение с временем создания
Memo.Lines.Add('['+TimeToStr(Time)+'] Сервер создан :)');
end;

Теперь рассмотрим код клавиши "Закрыть сервер" (ServerOff):

procedure TForm1.ServerOffClick(Sender: TObject);
Begin
// клавишу Client, ServerOn и поля Host, Port разблокируем, ServerOff заблокируем
Client.Enabled:=True;
Host.Enabled:=True;
Port.Enabled:=True;
ServerOff.Enabled:=False;
ServerOn.Enabled:=True;
// закрываем сервер
ServerSocket.Active:=False;
// выводим сообщение в Memo
Memo.Lines.Add('['+TimeToStr(Time)+'] Сервер закрыт!');
end;

Теперь разберемся с событиями, которые будут происходить при определенном состоянии ServerSocket’а. Напишем процедуру, когда клиент подсоединился к серверу (OnClientConnect):

procedure TForm1.ServerSocketClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
// добавим в Memo сообщение с временем подключения пользователя
Memo.Lines.Add('['+TimeToStr(Time)+'] Подключился пользователь.');
end;

Теперь когда клиент отключается (OnClientDisconnect):

procedure TForm1.ServerSocketClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
// добавим в Memo сообщение с временем отключения пользователя
Memo.Lines.Add('['+TimeToStr(Time)+'] Пользователь отключился.');
end;

Когда на сервер приходит очередное сообщение клиента, мы должны сразу же отображать его (OnClientRead):

procedure TForm1.ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
// добавим в Memo клиентское сообщение
Memo.Lines.Add(Socket.ReceiveText());
end;

Самое главное в любом сетевом сайте – это отправка сообщений. Напишем процедуру кнопки SendText(OnClick):

procedure TForm1.SendTextClick(Sender: TObject);
begin
// проверка, в каком режиме находится программа
If ServerSocket.Active=True then
// отправляем сообщение с сервера
ServerSocket.Socket.Connections[0].SendText('['+TimeToStr(Time)+'] '+Name.Text+': '+Send.Text)
else
// отправляем сообщение с клиента
ClientSocket.Socket.SendText('['+TimeToStr(Time)+'] '+Name.Text+': '+Send.Text);
// отобразим сообщение в Memo
Memo.Lines.Add('['+TimeToStr(Time)+'] '+Name.Text+': '+Send.Text);
end;

Теперь разберемся с режимом клиента. Вот процедура Client (OnClick):

procedure TForm1.ClientClick(Sender: TObject);
begin
If Client.Tag=0 then
Begin
// клавишу ServerOn, ServerOff и поля Host, Port заблокируем
ServerOff.Enabled:=False;
ServerOn.Enabled:=False;
Host.Enabled:=False;
Port.Enabled:=False;
// запишем указанный порт в ClientSocket
ClientSocket.Port:=StrToInt(Port.Text);
// запишем хост и адрес
ClientSocket.Host:=Host.Text;
ClientSocket.Address:=Host.Text;
// запускаем клиента
ClientSocket.Active:=True;
// изменяем тэг
Client.Tag:=1;
// меняем надпись клавиши
Client.Caption:='Отключиться';
end
else
Begin
// клавишу ServerOn и поля Host, Port разблокируем
ServerOn.Enabled:=True;
ServerOff.Enabled:=False;
Host.Enabled:=True;
Port.Enabled:=True;
// закрываем клиента
ClientSocket.Active:=False;
// выводим сообщение в Memo
Memo.Lines.Add('['+TimeToStr(Time)+'] Сессия закрыта.');
// возвращаем тэгу исходное значение
Client.Tag:=0;
// возвращаем исходную надпись клавиши
Client.Caption:='Подключиться';
end;
end;

Ну чат уже почти готов, нам осталось прописать процедуры на OnConnect, OnDisconnect, OnRead клиента ClientSocket. Сначала на чтение сообщения с сервера (OnRead):

procedure TForm1.ClientSocketRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
// добавим в Memo пришедшее сообщение
Memo.Lines.Add(Socket.ReceiveText());
end;

Дальше все просто, обычное добавление в Memo определенного сообщения:

procedure TForm1.ClientSocketConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
// добавим в Memo сообщение о соединении с сервером
Memo.Lines.Add('['+TimeToStr(Time)+'] Подключение к серваку.');
end;
procedure TForm1.ClientSocketDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
// добавим в Memo сообщение о потере связи
Memo.Lines.Add('['+TimeToStr(Time)+'] Сервер не был найден.');
end;

Вот вроде и все что я хотел показать вам сегодня. И исходя из этого простого примера чата, можно создать профессиональный чат с массами новых возможностей. В следующей версии я исправлю все недачеты, будет добавлено много новых функций. Всем спасибо на вмимание. Удачи J :)

Исходник (http://depositfiles.com/files/6804376)
Exe-файл (http://depositfiles.com/files/6804422)

De-visible
27.07.2008, 10:09
Такие темы в дальнейшем буду удалять, копипаст не есть хорошо.

_GlaD1aT(OR)_
27.07.2008, 10:20
Если можно ссылку на основной ресурс. Я на диске исходник клиента нашел, и просто написал статью

Ch3ck
27.07.2008, 12:18
А с кем говорить то?
Егорыч давай в чат...

_GlaD1aT(OR)_
27.07.2008, 12:42
В следующей версии программы добавлю возможность звуковых отчетов, сделаю удобный интерфейс и постараюсь исправить все ошибки. Ждите :)

De-visible
27.07.2008, 13:18
В следующей версии программы добавлю возможность звуковых отчетов, сделаю удобный интерфейс и постараюсь исправить все ошибки. Ждите :)
Эта не статья раз!
Код скопирован два!
Комментарии добавить по книге, сложно как ппц...-это три!
Вывод: Почитай, погугли, разберись, и сделай свой код, свою статью...
Копипаст это "-" в репутацию...
пока незачот!

t04
27.07.2008, 15:40
сделай лучше не только на двоих а на много человек, на сокетах, юпд протокол, интрефейс как у qip, тогда толково будет.