AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Problem mit INDY TCP
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit INDY TCP

Ein Thema von Abraxas · begonnen am 19. Jun 2007 · letzter Beitrag vom 21. Jun 2007
Antwort Antwort
Abraxas

Registriert seit: 19. Jun 2007
11 Beiträge
 
#1

Problem mit INDY TCP

  Alt 19. Jun 2007, 16:18
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
Angehängte Dateien
Dateityp: rar test_178.rar (10,3 KB, 4x aufgerufen)
  Mit Zitat antworten Zitat
Udontknow

Registriert seit: 17. Jun 2002
223 Beiträge
 
#2

Re: Problem mit INDY TCP

  Alt 21. Jun 2007, 13:14
Hallo!

Habe nur grob drüber gekuckt:

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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:08 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