Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Problem mit Netzwerkchat: Absturz bei reconnect (https://www.delphipraxis.net/107612-problem-mit-netzwerkchat-absturz-bei-reconnect.html)

TheConsul 30. Jan 2008 17:04


Problem mit Netzwerkchat: Absturz bei reconnect
 
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.

TheConsul 9. Feb 2008 17:18

Re: Problem mit Netzwerkchat: Absturz bei reconnect
 
danke fuer die zahlreichen antworten :cry:

ringli 9. Feb 2008 19:00

Re: Problem mit Netzwerkchat: Absturz bei reconnect
 
Keine ahnung ob das etwas mit deinem Problem zu tun hat, aber sollte das
Delphi-Quellcode:
with AContext.Connection.IOHandler do
    LLine := ReadLn;
     LCmd := Fetch(LLine);
Operation := strtoint(LCmd[1]);
nicht eigentlich so aussehen:
Delphi-Quellcode:
with AContext.Connection.IOHandler do
  begin
    LLine := ReadLn;
    LCmd := Fetch(LLine);
    Operation := strtoint(LCmd[1]);
  end;
Ich kann dir nur raten deinen Quelltext mal etwas besser zu formatieren und zu kommentieren, denn dadurch sieht man auch schon mal den einen oder anderen Fehler. Kommentare im Quelltext würde es für andere einfacher machen die Funktionen zuordnen zu können. Du weißt vielleicht was Button1, 2 und 3 machen sollen, aber ein anderer rätselt unter Umständen erstmal.

SirThornberry 9. Feb 2008 19:04

Re: Problem mit Netzwerkchat: Absturz bei reconnect
 
wie bereits erwähnt ist ein ordentlich formatierter Quelltext notwendig damit andere auch schnell durchsehen. Solange du den Styleguide ingorierst ist es nicht verwunderlich das du keine Antworten bekommst. Man hat einfach den Eindruck das derjenige der die Frage gestellt hat sich nicht mal die Zeit nimmt den Quelltext zu formatieren aber erwartet, dass andere seinen quelltext anschauen und verstehen wozu sie ja selbst erstmal den Quelltext in den meisten fällen formatieren müssen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz