Connection Closed Gracefully ile ilgili

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
heavy
Üye
Mesajlar: 67
Kayıt: 07 May 2005 03:31

Connection Closed Gracefully ile ilgili

Mesaj gönderen heavy »

arkadaşlar forumda aradım konuyla ilgili mesajlar var fakat çözüm bulamadım. aslında bir çözüm var ama onu yapıncada program işe yaramıyor. şöyleki;
aşağıdaki şekilde bir form yaptım (Delphi 7 kullanıyorum).

Resim

bu form içinde aşağıdaki kodları kullandım.

Kod: Tümünü seç

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPServer, IdAntiFreezeBase,
  IdAntiFreeze, IdTCPConnection, IdTCPClient, StdCtrls, ExtCtrls, Buttons;

type
  TForm1 = class(TForm)
    IdTCPServer1: TIdTCPServer;
    IdTCPClient1: TIdTCPClient;
    IdAntiFreeze1: TIdAntiFreeze;
    ListBox1: TListBox;
    Label1: TLabel;
    Shape1: TShape;
    SpeedButton1: TSpeedButton;
    ListBox2: TListBox;
    Label2: TLabel;
    Memo1: TMemo;
    BitBtn1: TBitBtn;
    Timer1: TTimer;
    procedure IdTCPServer1Connect(AThread: TIdPeerThread);
    procedure IdTCPServer1Execute(AThread: TIdPeerThread);
    procedure SpeedButton1Click(Sender: TObject);
    procedure IdTCPServer1Disconnect(AThread: TIdPeerThread);
    procedure Memo1Enter(Sender: TObject);
    procedure IdTCPClient1Connected(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure BitBtn1Click(Sender: TObject);
    procedure IdTCPClient1Disconnected(Sender: TObject);
    procedure IdTCPClient1Status(ASender: TObject;
      const AStatus: TIdStatus; const AStatusText: string);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
var
  pc: AnsiString;
begin
  ListBox1.Items.Add('Bağlantı İsteği Geldi');
  pc := AThread.Connection.Socket.Binding.PeerIP;
  ListBox1.Items.Add('İstek Gelen IP:' + pc);
  AThread.Connection.WriteLn('connecting_ok');
  ListBox1.Items.Add('Gelen İsteğe "connecting_ok" Mesajı Gönderildi');
end;

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
  log: AnsiString;
begin
  log := AThread.Connection.ReadLn();
  ListBox1.Items.Add('Msg: ' + log);
  AThread.Connection.WriteLn('msg_receive_ok');
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  if SpeedButton1.Down = True then
  begin
    SpeedButton1.Caption := 'Bağlantıyı Kes';
    idTCPClient1.Connect();
  end
  else
  begin
    SpeedButton1.Caption := 'Bağlan';
    try
      Timer1.Enabled:=False;
      idTCPClient1.Disconnect();
    except
      ListBox2.Items.Add('Bağlantı Kesme Hatası!');
    end;
  end;
end;

procedure TForm1.IdTCPServer1Disconnect(AThread: TIdPeerThread);
var
  pc: AnsiString;
begin
  pc := AThread.Connection.Socket.Binding.PeerIP;
  ListBox1.Items.Add('Bağlantıyı Kesti (IP):' + pc);
end;

procedure TForm1.Memo1Enter(Sender: TObject);
begin
  Memo1.SelectAll;
end;

procedure TForm1.IdTCPClient1Connected(Sender: TObject);
begin
  Memo1.Enabled := True;
  BitBtn1.Enabled := True;
  Memo1.SetFocus;
  Timer1.Enabled := True;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  idTCPClient1.Disconnect();
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  mesaj: AnsiString;
begin
  mesaj := Trim(Memo1.Lines.Text);
  idTCPClient1.WriteLn(mesaj);
  Memo1.Clear;
  Memo1.SetFocus;
end;

procedure TForm1.IdTCPClient1Disconnected(Sender: TObject);
begin
  Memo1.Enabled := False;
  BitBtn1.Enabled := False;
  Timer1.Enabled := False;
end;

procedure TForm1.IdTCPClient1Status(ASender: TObject;
  const AStatus: TIdStatus; const AStatusText: string);
begin
  ListBox2.Items.Add(AstatusText);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  log: AnsiString;
begin
  if idTCPClient1.Connected then
  begin
    log := idTCPClient1.ReadLn();
    ListBox2.Items.Add('Server Mesajı: ' + log);
  end;
end;

end.
programı çalıştırıp mesaj yollama yaptığımda sorun yok fakat bağlantıyı kesmeye çalıştığımda "Connection Closed Gracefully" mesajını alıyorum.

Resim

Timer1 komponentini kaldırdığımda progam çalışıyor fakat idTCPServer1 den gelen mesajları okuyamıyorum. Bunu aktif edince de program kapanışta hata veriyor. Bu problemi nasıl çözebilirim fikri olan varmı?

Kodları denemek isterseniz download edebilirsiniz.
http://rapidshare.com/files/223725589/IndyTCPTest.rar
heavy
Üye
Mesajlar: 67
Kayıt: 07 May 2005 03:31

Re: Connection Closed Gracefully ile ilgili

Mesaj gönderen heavy »

Sorunu çözdüm. Gerekirse kodları aşağıda bulabilirsiniz. Yalnız çalışma esnasında Delphi hata veriyor (derlemeden sonra hata olmuyor). Dunu önlemek içinde Tools / Debugger Options... / Language Exceptions / bölümündeki Stop on Delphi Exceptions kutucuğunu boşaltmanız gerekiyor.

Resim

Kod: Tümünü seç

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPServer, IdAntiFreezeBase,
  IdAntiFreeze, IdTCPConnection, IdTCPClient, StdCtrls, ExtCtrls, Buttons,
  Sockets, IdException;

type
  TForm1 = class(TForm)
    IdTCPServer1: TIdTCPServer;
    IdAntiFreeze1: TIdAntiFreeze;
    ListBox1: TListBox;
    Label1: TLabel;
    Shape1: TShape;
    SpeedButton1: TSpeedButton;
    ListBox2: TListBox;
    Label2: TLabel;
    Memo1: TMemo;
    BitBtn1: TBitBtn;
    Timer1: TTimer;
    IdTCPClient1: TIdTCPClient;
    procedure IdTCPServer1Connect(AThread: TIdPeerThread);
    procedure IdTCPServer1Execute(AThread: TIdPeerThread);
    procedure SpeedButton1Click(Sender: TObject);
    procedure IdTCPServer1Disconnect(AThread: TIdPeerThread);
    procedure Memo1Enter(Sender: TObject);
    procedure IdTCPClient1Connected(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure BitBtn1Click(Sender: TObject);
    procedure IdTCPClient1Disconnected(Sender: TObject);
    procedure IdTCPClient1Status(ASender: TObject;
      const AStatus: TIdStatus; const AStatusText: string);
    procedure IdTCPServer2AfterCommandHandler(ASender: TIdTCPServer;
      AThread: TIdPeerThread);
    procedure Memo1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
var
  pc: AnsiString;
begin
  ListBox1.Items.Add('Bağlantı İsteği Geldi');
  pc := AThread.Connection.Socket.Binding.PeerIP;
  ListBox1.Items.Add('İstek Gelen IP:' + pc);
  AThread.Connection.WriteLn('connecting_ok');
  ListBox1.Items.Add('Gelen İsteğe "connecting_ok" Mesajı Gönderildi');
  if idTCPClient1.Connected then
    ListBox2.Items.Add('Server Mesajı: ' + idTCPClient1.ReadLn());
end;

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
  log: AnsiString;
begin
  log := AThread.Connection.ReadLn();
  ListBox1.ItemIndex := ListBox1.Items.Add('Msg: ' + log);
  AThread.Connection.WriteLn('msg_receive_ok');
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  if SpeedButton1.Down = True then
  begin
    SpeedButton1.Caption := 'Bağlantıyı Kes';
    idTCPClient1.Connect();
  end
  else
  begin
    SpeedButton1.Caption := 'Bağlan';
    try
      idTCPClient1.Disconnect();
    except
      ListBox2.Items.Add('Bağlantı Kesme Hatası!');
    end;
  end;
end;

procedure TForm1.IdTCPServer1Disconnect(AThread: TIdPeerThread);
var
  pc: AnsiString;
begin
  pc := AThread.Connection.Socket.Binding.PeerIP;
  ListBox1.Items.Add('Bağlantıyı Kesti (IP):' + pc);
  AThread.Connection.Socket.Binding.CloseSocket();
end;

procedure TForm1.Memo1Enter(Sender: TObject);
begin
  Memo1.SelectAll;
end;

procedure TForm1.IdTCPClient1Connected(Sender: TObject);
begin
  Timer1.Enabled := True;
  Memo1.Enabled := True;
  BitBtn1.Enabled := True;
  Memo1.SetFocus;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  idTCPClient1.Disconnect();
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  mesaj: AnsiString;
begin
  mesaj := Trim(Memo1.Lines.Text);
  idTCPClient1.WriteLn(mesaj);
  Memo1.Clear;
  Memo1.SetFocus;
end;

procedure TForm1.IdTCPClient1Disconnected(Sender: TObject);
begin
  Timer1.Enabled := False;
  Memo1.Enabled := False;
  BitBtn1.Enabled := False;
end;

procedure TForm1.IdTCPClient1Status(ASender: TObject;
  const AStatus: TIdStatus; const AStatusText: string);
begin
  ListBox2.Items.Add('Status: ' + AStatusText);
end;

procedure TForm1.IdTCPServer2AfterCommandHandler(ASender: TIdTCPServer;
  AThread: TIdPeerThread);
begin
  if idTCPClient1.Connected then
    ListBox2.Items.Add('Server Mesajı: ' + idTCPClient1.ReadLn());
end;

procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (SSAlt in Shift) and (Key = vk_return) then
    BitBtn1.Click;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  aText: string;
begin
  aText := '';
  Timer1.Enabled := false;
  try
    idTCPClient1.ReadTimeout := 10;
    try
      aText := idTCPClient1.ReadLn;
      if (aText <> '') then
        ListBox2.ItemIndex := ListBox2.Items.Add('Server Mesajı: ' + aText);
    except
      on EIDReadTimeout do ;
      on e: exception do
      begin
        Timer1.Enabled := false;
        idTCPClient1.Disconnect;
        raise;
      end
    end;
  finally
    idTCPClient1.ReadTimeout := 0;
    if idTCPClient1.Connected then
      Timer1.Enabled := true;
  end;
end;

end.
Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Re: Connection Closed Gracefully ile ilgili

Mesaj gönderen G.Arkas »

Ama şöyle bir durum var o kutucuğu işaretlemediğinizde sadece sizi hata kodlarından kurtarıyor.Peki program verimli çaışıyor mu?
Nonblicking socketler de ki
errorcode:=0;olayı gibi.
Resim
heavy
Üye
Mesajlar: 67
Kayıt: 07 May 2005 03:31

Re: Connection Closed Gracefully ile ilgili

Mesaj gönderen heavy »

derlemeden sonra exe sini çalıştırınca hata vermedi ve program çalıştı. fakat ayrıntılı bir test yapma fırsatım olmadı.
Sawyer
Üye
Mesajlar: 29
Kayıt: 05 May 2009 11:30

Re: Connection Closed Gracefully ile ilgili

Mesaj gönderen Sawyer »

tcp serverın execute eventine sacma sapan birsey yaz atıyorum label çıkart bi tane label1.caption:='x'; gibi hata almayacaksın
heavy
Üye
Mesajlar: 67
Kayıt: 07 May 2005 03:31

Re: Connection Closed Gracefully ile ilgili

Mesaj gönderen heavy »

kodlarda bu var yetmez mi ki?

Kod: Tümünü seç

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
  log: AnsiString;
begin
  log := AThread.Connection.ReadLn();
  ListBox1.ItemIndex := ListBox1.Items.Add('Msg: ' + log);
  AThread.Connection.WriteLn('msg_receive_ok');
end;
Cevapla