Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Problem mit INDY TCP (https://www.delphipraxis.net/94295-problem-mit-indy-tcp.html)

Abraxas 19. Jun 2007 16:18


Problem mit INDY TCP
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe ein neues Delphi projekt vor und habe versucht es LAN-fähig zu bekommen...
allerdings kommen mir immer fehler unter.
Kann mir einer sagen warum diese Unit nicht funktioniert?
Vll auch noch Lösungsvorschläge machen?
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdTCPServer, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, StdCtrls, IdThreadMgr, IdThreadMgrDefault;
type
  TNachricht = record
               Benutzer,Msg:string[100];
               end;
type
  ZClient = ^Client;
  Client = record
            Name : String[20];
            Verbunden,Aktion : TDateTime;
            Thread : Pointer;
           end;
type
  TForm1 = class(TForm)
    IdTCPClient1: TIdTCPClient;
    IdTCPServer1: TIdTCPServer;
    ListBox1: TListBox;
    Button1: TButton;
    Edit1: TEdit;
    Button2: TButton;
    ListBox2: TListBox;
    IdThreadMgrDefault1: TIdThreadMgrDefault;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure IdTCPServer1Connect(AThread: TIdPeerThread);
    procedure IdTCPServer1Execute(AThread: TIdPeerThread);
    procedure IdTCPServer1Disconnect(AThread: TIdPeerThread);
    procedure IdTCPClient1Connected(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
type
  Leser = class(TThread)
  private
  Nachricht:TNachricht;
  protected
  procedure execute;override;
  end;

var
  Form1: TForm1;
  Clienten : TThreadlist;

implementation

{$R *.dfm}
procedure Leser.execute;
begin
while not Terminated do
  begin
  if not Form1.IdTCPClient1.Connected then Terminate
  else
    try
    Form1.IdTCPClient1.ReadBuffer(Nachricht,sizeof(Nachricht));
    Form1.ListBox1.Items.Add(Nachricht.Benutzer+' : '+Nachricht.Msg);
    except
    end;
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
IDTCPServer1.Active:=True;
IDTCPClient1.Connect(5000);
end;

procedure TForm1.Button2Click(Sender: TObject);
var NeueNachricht : TNachricht;
begin
NeueNachricht.Benutzer:=IDTCPClient1.Localname;
NeueNachricht.Msg:=Edit1.Text;
IDTCPCLient1.WriteBuffer(NeueNachricht,Sizeof(NeueNachricht),True);
end;

procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
var NeuerClient : ZClient;
begin
Getmem(NeuerClient,sizeof(Client));
NeuerClient.Name:=Athread.Connection.LocalName;
NeuerClient.Verbunden:=Now;
NeuerClient.Aktion:=NeuerClient.Verbunden;
NeuerClient.Thread:=Athread;
Athread.Data:=TObject(NeuerClient);
try
Clienten.LockList.Add(NeuerClient);
finally
Clienten.UnlockList;
end;
ListBox2.Items.Add(timetostr(Time)+' '+(NeuerClient.Name)+' hat sich verbunden.');
end;

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var AktClient, Empfaenger:ZClient;
    Nachricht:TNachricht;
    ZielThread:TIdPeerThread;
    i:integer;
begin
If not aThread.Terminated and AThread.Connection.Connected then
  begin
  Athread.Connection.ReadBuffer(Nachricht,sizeof(Nachricht));
  AktClient:= Zclient(athread.Data);
  AktClient.Aktion:=Now;
    with Clienten.LockList do
      try
      for i:=0 to count-1 do
        begin
        Empfaenger:=Items[i];
        Zielthread:=Empfaenger.Thread;
        Zielthread.Connection.WriteBuffer(Nachricht,sizeof(Nachricht),True);
        end;
      finally
      clienten.UnlockList;
    end;
end;
end;

procedure TForm1.IdTCPServer1Disconnect(AThread: TIdPeerThread);
var aktClient: ZClient;
begin
AktClient:=ZClient(AThread.Data);
  try
  Clienten.LockList.Remove(AktClient);
  finally
  Clienten.UnlockList;
  end;
FreeMem(aktClient);
Athread.Data:=nil;
end;

procedure TForm1.IdTCPClient1Connected(Sender: TObject);
begin
Leser.Create(True);
Button2.Enabled:=True;
end;

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

end.
Thx!
Anbei das ganze Projekt.


MfG Abraxas

Udontknow 21. Jun 2007 13:14

Re: Problem mit INDY TCP
 
Hallo!

Habe nur grob drüber gekuckt:

Delphi-Quellcode:
Leser.Create(True);
Das ist schon mal nicht so gut. Du erstellst eine Instanz einer Klasse (deren Name übrigens immer mit "T" beginnen sollte), ohne dir dann die Objektreferenz der Instanz in einer Variable festzuhalten. Wie willst du den Thread jemals starten, wenn du jegliche Referenz dazu verloren hast?

Wo wird die Instanz der Variablen "Clienten" erstellt? Da habe ich nichts dergleichen gesehen.

Desweiteren solltest du Client und Server in einer separaten Anwendung halten.

Cu,
Udontknow


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:40 Uhr.

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