Чат на двоих [Delphi]

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _GlaD1aT(OR)_, 27 Jul 2008.

  1. _GlaD1aT(OR)_

    _GlaD1aT(OR)_ Elder - Старейшина

    Joined:
    24 Jul 2008
    Messages:
    38
    Likes Received:
    15
    Reputations:
    0
    Создание чата при помощи 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 :)

    Исходник
    Exe-файл
     
  2. De-visible

    De-visible [NDC] Network develope c0ders

    Joined:
    6 Jan 2008
    Messages:
    916
    Likes Received:
    550
    Reputations:
    66
    Такие темы в дальнейшем буду удалять, копипаст не есть хорошо.
     
  3. _GlaD1aT(OR)_

    _GlaD1aT(OR)_ Elder - Старейшина

    Joined:
    24 Jul 2008
    Messages:
    38
    Likes Received:
    15
    Reputations:
    0
    Если можно ссылку на основной ресурс. Я на диске исходник клиента нашел, и просто написал статью
     
  4. Ch3ck

    Ch3ck Elder - Старейшина

    Joined:
    9 Jun 2006
    Messages:
    1,362
    Likes Received:
    1,157
    Reputations:
    430
    А с кем говорить то?
    Егорыч давай в чат...
     
    #4 Ch3ck, 27 Jul 2008
    Last edited: 27 Jul 2008
  5. _GlaD1aT(OR)_

    _GlaD1aT(OR)_ Elder - Старейшина

    Joined:
    24 Jul 2008
    Messages:
    38
    Likes Received:
    15
    Reputations:
    0
    В следующей версии программы добавлю возможность звуковых отчетов, сделаю удобный интерфейс и постараюсь исправить все ошибки. Ждите :)
     
  6. De-visible

    De-visible [NDC] Network develope c0ders

    Joined:
    6 Jan 2008
    Messages:
    916
    Likes Received:
    550
    Reputations:
    66
    Эта не статья раз!
    Код скопирован два!
    Комментарии добавить по книге, сложно как ппц...-это три!
    Вывод: Почитай, погугли, разберись, и сделай свой код, свою статью...
    Копипаст это "-" в репутацию...
    пока незачот!
     
  7. t04

    t04 Elder - Старейшина

    Joined:
    10 Jan 2007
    Messages:
    137
    Likes Received:
    40
    Reputations:
    8
    сделай лучше не только на двоих а на много человек, на сокетах, юпд протокол, интрефейс как у qip, тогда толково будет.