Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Formloses SocketProgramm (https://www.delphipraxis.net/105845-formloses-socketprogramm.html)

napsterxx 31. Dez 2007 14:55


Formloses SocketProgramm
 
Habe einen Server mit einer Form und einen SocketCLient ohne Form. Ich will dass der Client den Server connectet:

Delphi-Quellcode:
program Client;

uses
  ScktComp, windows, SysUtils;

var
  Connected : Boolean = False;
  ClientSocket : TClientSocket;

{$R *.res}

begin

  ClientSocket := TClientSocket.Create(nil);
  ClientSocket.Port := 3460;
  ClientSocket.Host := 'localhost';

  while Connected = False do
  begin          
    sleep(10000);
    ClientSocket.Open;
  end;

end.
Sobald beim Server jemand connced dann wird die Caption der Form geändert:
Delphi-Quellcode:
procedure TForm1.ServerSocketClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Form1.Caption := 'Neuer Client';
end;
Aber es funktioniert nicht.
Beim Server habe ich außerdem noch folgendes:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  ServerSocket.Port := 3460;
  ServerSocket.Open;
end;
Kann jemand helfen? Please :)

Bernhard Geyer 31. Dez 2007 15:08

Re: Formloses SocketProgramm
 
Mit sleep(10000) legst du den ganzen Prozess schlafen. Da kann also im Hintergrund nix connecten.

napsterxx 31. Dez 2007 15:29

Re: Formloses SocketProgramm
 
Wenn ich das aber weglasse dann kommt immer ein Fehler das ich so ein Maximum überschritten habe oO

DeddyH 31. Dez 2007 15:31

Re: Formloses SocketProgramm
 
Zitat:

Zitat von napsterxx
Delphi-Quellcode:
while Connected = False do
  begin          
    sleep(10000);
    ClientSocket.Open;
  end;

Wann wird Connected eigentlich true?

napsterxx 31. Dez 2007 15:33

Re: Formloses SocketProgramm
 
Das wollte ich ja eigenltich machen^^ soll True werden wenn verbindet ist aber irgendwie wird ja nie verbindet

mkinzler 31. Dez 2007 15:38

Re: Formloses SocketProgramm
 
Klar wenn das Programm einmal in deiner Schleife ist, kommt es da nicht mehr raus.

Bernhard Geyer 31. Dez 2007 15:39

Re: Formloses SocketProgramm
 
Zitat:

Zitat von napsterxx
Das wollte ich ja eigenltich machen^^ soll True werden wenn verbindet ist aber irgendwie wird ja nie verbindet

Kann es auch gar nicht wenn du den Prozess schlafen legt. Der Implementierung von TClientSocket ist auf asynchronität/Events ausgelegt. AFAIK basiert im Hintergrund des TCP/IP-Stacks über Windows-Messages.

Willst du einen blockierenden Ansatz so brauchst du TCP/IP-Komponenten die einen synchronen ablauf ermöglichen. Es gibt für Delphi welche, aber der Name fällt mir im Moment nicht ein.

sirius 31. Dez 2007 15:39

Re: Formloses SocketProgramm
 
Ich kenn die Socket-Komponenten nicht ganz auswendig. Aber es könnte sein, dass sie mit Messages arbeiten. Deswegen würde ich mal eine Messageschleife vorschlagen. Ob das die Lösung ist kann ich so nicht sagen.
Messageschleife an sich sieht so aus
Delphi-Quellcode:
uses windows, messages
var msg:Tmsg;
...
while getmessage(msg,0,0,0) do
begin
  translatemessage(msg); //nur nötig, wenn Tastendrücke ausgewertet werden müssen
  dispatchmessage(msg);
end;
Die Schleife wird mittels postquitmessage beendet. aber du müsstest dir das wahrscheinlich anders anpassen (vielleicht auch peekmessage und/oder waitmessage benutzen)....

napsterxx 31. Dez 2007 15:42

Re: Formloses SocketProgramm
 
what?? jetzt versteh ich nichts mehr. :wall:
wie kann ich dsa dann machen das mein Prozess nicht schlafen gelegt wird, aber nur alle 10 sekunden beginnt zu verbinden? :lol:

mkinzler 31. Dez 2007 15:43

Re: Formloses SocketProgramm
 
Timer

napsterxx 31. Dez 2007 15:44

Re: Formloses SocketProgramm
 
Dann wird mein Programm aber wieder richtig groß

DeddyH 31. Dez 2007 15:46

Re: Formloses SocketProgramm
 
Schau mal nach Delay.

napsterxx 31. Dez 2007 15:50

Re: Formloses SocketProgramm
 
Wenn ich Delay verwende muss ich Forms einbinden und dann wird das auch recht groß.
Wenn ich einen Timer erstelle also Create(nil) lege ich dann das interval fest, aber wie kann ich OnTimer festlegen?

[Fehler] Client.dpr(23): E2009 Inkompatible Typen: 'Methodenzeiger und reguläre Prozedur'

Delphi-Quellcode:
program Client;

uses
  ScktComp, windows, SysUtils, ExtCtrls;

var
  Connected : Boolean = False;
  ClientSocket : TClientSocket;
  ConnectTimer : TTimer;

{$R *.res}
procedure ConnectTimerOnTimer(Sender: TObject);
begin

end;

begin

  ClientSocket := TClientSocket.Create(nil);
  ConnectTimer := TTimer.Create(nil);
  ConnectTimer.Interval := 10000;

  ConnectTimer.OnTimer := ConnectTimerOnTimer;
....

mkinzler 31. Dez 2007 16:02

Re: Formloses SocketProgramm
 
ConnectTimerOnTimer muss Teil einer Klasse sein.

napsterxx 31. Dez 2007 16:05

Re: Formloses SocketProgramm
 
Also muss der Timer dann die Klasse sein?

Delphi-Quellcode:
  type
  Timer = class(TTimer)
    procedure ConnectTimerOnTimer(Sender: TObject);


  end;

var
  Connected : Boolean = False;
  ClientSocket : TClientSocket;
  ConnectTimer : Timer;

{$R *.res}


procedure Timer.ConnectTimerOnTimer(Sender: TObject);
begin

end;

begin

  ClientSocket := TClientSocket.Create(nil);
  ConnectTimer := Timer.Create(nil);
  ConnectTimer.Interval := 10000;

  ConnectTimer.OnTimer := ConnectTimerOnTimer;

[Fehler] Client.dpr(32): E2003 Undefinierter Bezeichner: 'ConnectTimerOnTimer'

DeddyH 31. Dez 2007 16:06

Re: Formloses SocketProgramm
 
Nein, erstelle Dir eine Dummy-Klasse, die einen Timer enthält.

[edit] Obwohl das alles Blödsinn ist, einen Konsolenanwendung ist nun mal nicht ereignisgesteuert. [/edit]

sirius 1. Jan 2008 16:35

Re: Formloses SocketProgramm
 
So funktioniert es :
Delphi-Quellcode:
program Project1;

uses scktcomp, windows, messages;

var clientsocket:Tclientsocket;
    msg:Tmsg;

begin
  clientsocket:=Tclientsocket.Create(nil);
  try

    clientsocket.Host:='127.0.0.1';
    clientsocket.Port:=21000;
    clientsocket.Open;

    while not clientsocket.active do
    begin
      if not getmessage(msg,0,0,0) then exit;
      dispatchmessage(msg);
    end;

    while clientsocket.active do
    begin
      if not getmessage(msg,0,0,0) then exit;
      dispatchmessage(msg);
    end;

  finally
    clientsocket.free;
  end;
end.
Aber um das sinnvoll weiter zu benutzen solltest du schonmal mit Klassen anfangen.

napsterxx 1. Jan 2008 17:45

Re: Formloses SocketProgramm
 
Oki werde ich machen allen THX und einen guten Rutsch naja hoffe ihr hattet einen ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:01 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