_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)
Сейчас ты узнаешь, как создать простейший чат на два пользователя. Его можно использовать в обмене важными данными, т.к. есть вероятность, что на твоем компе установлен какой-нибудь троян 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)