Einzelnen Beitrag anzeigen

TheConsul

Registriert seit: 30. Jan 2008
2 Beiträge
 
#1

Problem mit Netzwerkchat: Absturz bei reconnect

  Alt 30. Jan 2008, 18:04
Hi ich programmiere gerade ein Chat-Programm.
Ich sitze jetzt schon eine Weile an einem Problem:
Fall1: Ich connecte mich auf den Server (Willkommensnachicht erhalten), disconnecte mich und connecte wieder.
Kein Problem tritt auf.
Fall2: Wie in 1 ich sende diesesmal allerdings eine nachicht, die an alle übermittelt wird, nach dem reconnect stürzt
der Client allerdings ab! Und der Server sobald ich ihn neustarte.
Ich wäre dankbar für eure Hilfe

Hier der Source:

Server:
Delphi-Quellcode:
unit Chat;

interface

uses
   Controls, Forms, Classes,
  IdBaseComponent, IdComponent, IdTCPServer, IdContext,
  SysUtils, IdCustomTCPServer, StdCtrls,IdGlobal, ExtCtrls;

type
  TForm1 = class(TForm)
    TCPServ: TIdTCPServer;
    Button1: TButton;
    ListBox1: TListBox;
    Button2: TButton;
    procedure OnExecute(AContext: TIdContext);
    procedure AnAlleSenden (LLine:string);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Connect(AContext: TIdContext);
    procedure Disconnect(AContext: TIdContext);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure TForm1.AnAlleSenden (LLine:string);
var i:integer;
begin
//for i:=0 to TCPServ.Contexts.LockList.Count -1 do
//TIdContext(TCPServ.Contexts.LockList.Items[i]).Connection.IOHandler.writeln('>>'+LLine);

  with TCPServ.contexts.LockList do
        try
          for i := 0 to Count-1 do
     begin
     TIdContext(TCPServ.Contexts.LockList.Items[i]).Connection.IOHandler.writeln('>>'+LLine);

     end;
        finally
    TCPserv.Contexts.UnlockList;
        end;
end;


procedure TForm1.OnExecute(AContext: TIdContext);
var Operation,i:integer;
var LLine,lcmd:string;
begin

with AContext.Connection.IOHandler do
    LLine := ReadLn;
     LCmd := Fetch(LLine);
Operation := strtoint(LCmd[1]);

Case Operation of

0: AnAlleSenden('<Server>:ClientConnected!');
1: AnAlleSenden(copy(LCmd,2,length(LCmd)));
2: begin AContext.Connection.Disconnect;listbox1.items.add('Client disconnected');end;

 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
TCPServ.Active:=true;
listbox1.Items.add('Server gestartet!');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
TCPServ.Active:=false;
listbox1.Items.add('Server gestoppt!');
end;

procedure TForm1.Connect(AContext: TIdContext);
begin
AContext.Connection.IOHandler.writeln ('Willkommen!');
end;

procedure TForm1.Disconnect(AContext: TIdContext);
begin
AContext.Connection.
end;

end.
Client:

Delphi-Quellcode:
unit Chat2;

interface

uses
   Controls, Forms, Classes,
  IdBaseComponent, IdComponent, IdTCPServer, IdContext,
  SysUtils, IdCustomTCPServer, StdCtrls,IdGlobal, ExtCtrls,
  IdTCPConnection, IdTCPClient;
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    ListBox1: TListBox;
    Button1: TButton;
    Edit2: TEdit;
    Edit3: TEdit;
    Button2: TButton;
    TCPClient: TIdTCPClient;
    Button3: TButton;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
begin
TCPClient.Host:=Edit2.Text;
 TCPClient.Connect;
 if TCPClient.Connected then
 begin
 listbox1.items.Add('Verbunden zu '+Edit2.text);
 Listbox1.Items.Add(TCPClient.IOHandler.ReadLn);
 end;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
      TCPClient.IOHandler.WriteLn('1'+Edit1.text);
      Listbox1.Items.Add(TCPClient.IOHandler.ReadLn);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
TCPClient.IOHandler.WriteLn('2');
TCPClient.Disconnect;
end;

end.
  Mit Zitat antworten Zitat