Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.04.2009, 00:14   #1
SoulReaver
Пользователь
 
Регистрация: 17.04.2009
Сообщений: 10
По умолчанию Ошибка с Indy - Connection Closed Gracefully

Начал изучать Indy. Пока дается туго. Стал читать книгу "Глубины Indy", но уже на середине понял что ничего не понимаю, а примеры что приводят - не рабочие (нужно самому до делывать). В итоге скачал семплы - стало по легче. Решил сделать простенький чатик. Программа клиент - программа сервер, но столкнулся с ошибкой "Connection Closed Gracefully". Где-то прочитал что это не ошибка вовсе, а исключение, но т.к. с ними я работать не умею и вообще 1 раз слышу, то опять дело встало. Вот код клиента.

Код:
interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, XPMan, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, ExtCtrls;

type
  TForm1 = class(TForm)
    lst1: TListBox;
    lbl1: TLabel;
    XPManifest1: TXPManifest;
    edt1: TEdit;
    lbl2: TLabel;
    edt2: TEdit;
    lbl3: TLabel;
    mmo1: TMemo;
    btn1: TButton;
    btn2: TButton;
    btn3: TButton;
    Client: TIdTCPClient;
    edt3: TEdit;
    tmr1: TTimer;
    procedure ActiveButton;
    procedure DisActiveButton;
    procedure btn2Click(Sender: TObject);
    procedure btn3Click(Sender: TObject);
    procedure ClientConnected(Sender: TObject);
    procedure tmr1Timer(Sender: TObject);
    procedure ClientDisconnected(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
username:string;

procedure TForm1.ActiveButton;
begin
btn1.Enabled:=True;
btn3.Enabled:=True;
lst1.Enabled:=True;
mmo1.Enabled:=True;
btn2.Enabled:=False;
edt3.Enabled:=True;
edt1.Enabled:=False;
edt2.Enabled:=False;

end;

procedure TForm1.btn2Click(Sender: TObject);
begin

if (edt1.Text <> '') and (edt2.Text <> '') then
begin
///////////////////////
Client.Host:=edt1.Text;
username:=edt2.Text;
///////////////////////
ActiveButton;

Client.Connect;
tmr1.Enabled:=True;

end else begin
ShowMessage('Не все данные введены.');
end;


end;

procedure TForm1.DisActiveButton;
begin
btn1.Enabled:=False;
btn3.Enabled:=False;
lst1.Enabled:=False;
mmo1.Enabled:=False;
btn2.Enabled:=True;
edt3.Enabled:=False;
edt1.Enabled:=True;
edt2.Enabled:=True;
end;

procedure TForm1.btn3Click(Sender: TObject);
begin
DisActiveButton;
Client.Disconnect;
end;

procedure TForm1.ClientConnected(Sender: TObject);
begin
Client.WriteLn(username);
end;

procedure TForm1.tmr1Timer(Sender: TObject);
var
  msg:string;
begin

 if not Client.Connected then
    exit;

msg:= Client.ReadLn('',5);

  if msg <> ''then
  begin
    mmo1.Lines.Add(msg);
    end;
end;




procedure TForm1.ClientDisconnected(Sender: TObject);
begin
mmo1.Lines.Add('Дисконект!')

end;

end.
Ну а это вот код сервера:

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, XPMan, StdCtrls, IdBaseComponent, IdComponent, IdTCPServer;

type
  TForm1 = class(TForm)
    lst1: TListBox;
    btn1: TButton;
    btn2: TButton;
    XPManifest1: TXPManifest;
    lbl1: TLabel;
    Server: TIdTCPServer;
    mmo1: TMemo;
    lbl2: TLabel;
    procedure btn1Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
    procedure ServerConnect(AThread: TIdPeerThread);
    procedure ServerDisconnect(AThread: TIdPeerThread);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  username:string;

procedure TForm1.btn1Click(Sender: TObject);
begin
btn1.Enabled:=false;
btn2.Enabled:=True;
Server.Active:=True;
end;

procedure TForm1.btn2Click(Sender: TObject);
begin
btn1.Enabled:=true;
btn2.Enabled:=False;
end;

procedure TForm1.ServerConnect(AThread: TIdPeerThread);
begin
AThread.Connection.WriteLn('Соединение установленно.');
username:=AThread.Connection.ReadLn('',5);
mmo1.Lines.Add('Подключился клиент! ');
mmo1.Lines.Add('В чат вошел: '+username);
end;

procedure TForm1.ServerDisconnect(AThread: TIdPeerThread);
begin
mmo1.Lines.Add('Чат покинул:  '+username);
end;

end.
Клиент подключается к серверу и шлет имя юзера, сервак отправляет сообщение что клиент подключен. Клиент сообщение принемает, и вот в этот момент хз почему происходит дисконект и сообщение "Connection Closed Gracefully". Как я понял опытным путем вызывается где-то в обработке таймера. Какие мысли?
SoulReaver вне форума Ответить с цитированием
Старый 18.04.2009, 11:34   #2
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

На сервере напишите обработчик onexecute и не обменивайтесь нужными данными в onconnect
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 18.04.2009, 12:54   #3
SoulReaver
Пользователь
 
Регистрация: 17.04.2009
Сообщений: 10
По умолчанию

Сорь за нубский вопрос, но для чего этот обработчик служит?
SoulReaver вне форума Ответить с цитированием
Старый 18.04.2009, 13:02   #4
SoulReaver
Пользователь
 
Регистрация: 17.04.2009
Сообщений: 10
По умолчанию

Удалил всё из сервер конекшен, веренес в процедуру execute.

Код:
procedure TForm1.ServerException(AThread: TIdPeerThread;
  AException: Exception);
begin
username:=AThread.Connection.ReadLn('',5);
AThread.Connection.WriteLn('Подключение прошло успешно!');
mmo1.Lines.Add('Подключился клиент! ');
mmo1.Lines.Add('В чат вошел: '+username);
end;
К сожалению ошибка так и появляется.
SoulReaver вне форума Ответить с цитированием
Старый 18.04.2009, 13:29   #5
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

лучше и клиенту отправлять не в onconnect. Данное событие обычно используется для логирования, проверки аутентификации, и т.д.
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
"Connection Closed Gracefully." Что это значит? dimon000 Работа с сетью в Delphi 15 06.05.2014 14:31
idHTTP и ошибка Connection reset by peer. tebeen Работа с сетью в Delphi 11 23.01.2012 17:43
Ошибка Ftp connection reset by pear NetworM Работа с сетью в Delphi 6 27.03.2009 11:09
Ошибка На Indy SMTP в Delphi 2007 combays Помощь студентам 1 22.03.2009 03:08
Сообщение об ошибке:Cannot perfom this operation on a closed dataset! Tanuska___:) БД в Delphi 1 04.08.2008 17:52