![]() |
Formloses SocketProgramm
Habe einen Server mit einer Form und einen SocketCLient ohne Form. Ich will dass der Client den Server connectet:
Delphi-Quellcode:
Sobald beim Server jemand connced dann wird die Caption der Form geändert:
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.
Delphi-Quellcode:
Aber es funktioniert nicht.
procedure TForm1.ServerSocketClientConnect(Sender: TObject;
Socket: TCustomWinSocket); begin Form1.Caption := 'Neuer Client'; end; Beim Server habe ich außerdem noch folgendes:
Delphi-Quellcode:
Kann jemand helfen? Please :)
procedure TForm1.FormCreate(Sender: TObject);
begin ServerSocket.Port := 3460; ServerSocket.Open; end; |
Re: Formloses SocketProgramm
Mit sleep(10000) legst du den ganzen Prozess schlafen. Da kann also im Hintergrund nix connecten.
|
Re: Formloses SocketProgramm
Wenn ich das aber weglasse dann kommt immer ein Fehler das ich so ein Maximum überschritten habe oO
|
Re: Formloses SocketProgramm
Zitat:
|
Re: Formloses SocketProgramm
Das wollte ich ja eigenltich machen^^ soll True werden wenn verbindet ist aber irgendwie wird ja nie verbindet
|
Re: Formloses SocketProgramm
Klar wenn das Programm einmal in deiner Schleife ist, kommt es da nicht mehr raus.
|
Re: Formloses SocketProgramm
Zitat:
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. |
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:
Die Schleife wird mittels postquitmessage beendet. aber du müsstest dir das wahrscheinlich anders anpassen (vielleicht auch peekmessage und/oder waitmessage benutzen)....
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; |
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: |
Re: Formloses SocketProgramm
Timer
|
Re: Formloses SocketProgramm
Dann wird mein Programm aber wieder richtig groß
|
Re: Formloses SocketProgramm
Schau mal nach
![]() |
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; .... |
Re: Formloses SocketProgramm
ConnectTimerOnTimer muss Teil einer Klasse sein.
|
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' |
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] |
Re: Formloses SocketProgramm
So funktioniert es :
Delphi-Quellcode:
Aber um das sinnvoll weiter zu benutzen solltest du schonmal mit Klassen anfangen.
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. |
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