Autor |
Beitrag |
Savage
      
Beiträge: 110
|
Verfasst: Fr 14.02.03 15:02
Hi @All
ich versuche gerade ein Serverprogramm (mit ner Form1) als Konsolenanwendung umzuschreiben. Aber wie bekomme ich jetzt die IDTCPServer-Komponente im Programm zum laufen?
Ich scheitere schon beim erstellen (weil es gibt ja keine Form)
ich hoffe, ihr könnt mir helfen.
mfg
Savage
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 14.02.03 15:26
Gar nicht. Da hilft nur ein nicht sichtbares Fenster.
|
|
AndyB
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: Fr 14.02.03 15:41
Luckie hat folgendes geschrieben: | Gar nicht. Da hilft nur ein nicht sichtbares Fenster. |
Und warum sollte das nicht gehen? Die Indy-Komponenten binden in keinster Weise die Forms-Unit ein. Und in einigen Projekten von mir nutze ich die Indy-Komponente TIdHTTP und das ganze sogar in einer Konsolenanwendung.
Zitat: | Ich scheitere schon beim erstellen (weil es gibt ja keine Form) |
Dann solltest du dich mal mit dem Erstellen von Komponenten zur Laufzeit auseinander setzen.
_________________ Ist Zeit wirklich Geld?
|
|
Savage 
      
Beiträge: 110
|
Verfasst: Fr 14.02.03 15:43
das Programm soll aber später mal auf nen Linux Server laufen und auf dem Server läuft kein X.
Würde das nicht zu Fehlern kommen?
Gibt es da noch eine andere Variante?
MfG
Savage
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 14.02.03 15:48
Muß da nicht ein Objekt als Parent angegeben werden? Aber ich lasse mich gerne eines besseren belehren.
|
|
Klabautermann
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Fr 14.02.03 15:53
Hallo,
Savage hat folgendes geschrieben: | das Programm soll aber später mal auf nen Linux Server laufen und auf dem Server läuft kein X.
Würde das nicht zu Fehlern kommen?
Gibt es da noch eine andere Variante? |
ich bin mir gar nicht sicher ob das Fehler gibt, denn der Unterschied zwischen Linux-Konsolenanwendungen und XWindow-Anwendungen ist bei weiten nicht so groß wie der zwischen Konsolenanwendungen (oder gar DOS anwendungen) und Windows-Anwendungen.
Ich würde an deiner stelle mal versuchen eine Linux Application ohne Formular aber mit DataModul zu erstellen. Lege irgendeine Unsichtbare Komponente auf dieses und gebe das Ergebnis einer Aktion mit dieser Komponente einfach per WirteLn aus.
Wenn das klappt dürfest du auch keine Probleme mit den Indys haben.
Ob es klappt kann ich nicht sagen, einen Versuch sollte es aber wert sein.
Gruß
Klabautermann
|
|
Savage 
      
Beiträge: 110
|
Verfasst: Fr 14.02.03 16:04
das Problem beim Erzeugen ist folgender:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| program Project2; {$APPTYPE CONSOLE} uses sysutils,IdBaseComponent, IdComponent, IdTCPServer,classes;
var
idtcpserver1 : TIDTCPserver;
begin
idtcpserver1 := TIDtcpserver.Create(AOWner:TComponent); |
Als AOwner:TComponent gebe ich ja im normalfall: self ein, welches jedoch bestandteil der Form ist. Ich komme also noch nicht zum erzeugen, weil ich jetzt nicht weis, was ich dort eintragen soll?
@AndyB
Darf ich fragen, wie du diese IDHTTP in deiner Konsolen-Anwendung erzeugt hast? Weil dann wäre mein Problem auch schon sogut wie gelöst
@Klabautermann
Mein Problem liegt z.Z. darin, dass ich nur Windowsrechner da stehen hab. An Kylix und Linux komm ich erst wieder in einer Woche ran. Somit kann ich z.Z. das nicht testen.
mfg
Savage
|
|
AndyB
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: Fr 14.02.03 16:23
Man muss keinen Owner angeben. Wenn man dem Konstruktor nil übergibt, hat er einfach keinen Owner, der ihn freigeben könnte. Somit musst du selbst dafür sorgen, dass die Instanz freigegeben wird.
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| program ReadHttpFile; uses Libc, IdHttp; var IdHttp: TIdHTTP; s: string; begin IdHttp := TIdHTTP.Create(nil); try s := IdHttp.Get('http://' + ParamStr(1)); finally IdHttp.Free; end; WriteLn(s); // nach StdOut schreiben end. |
_________________ Ist Zeit wirklich Geld?
|
|
Savage 
      
Beiträge: 110
|
Verfasst: Fr 14.02.03 16:27
misst, an nil hatte ich jetzt nun überhaupt nicht mehr dran gedacht  .
vielen Dank AndyB und die anderen!
Ich werd dann mal schaun, ob es so funktioniert, wie ich es mir vorstelle.
MfG
Savage
|
|
AndyB
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: Fr 14.02.03 16:31
Wenn du unter Linux einen Server schreiben willst, dann wird dir folgender Code vielleicht helfen:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| program MyServer; uses Libc, MyServerUnit; begin if daemon(0, 0) = -1 then begin WriteLn('Es trat ein Fehler beim Starten des Servers auf.'); Exit; end;
StartServer; // steht in MyServerUnit und erzeugt die Komponenten. repeat Sleep(10); until False; end. |
_________________ Ist Zeit wirklich Geld?
Zuletzt bearbeitet von AndyB am Fr 14.02.03 18:00, insgesamt 1-mal bearbeitet
|
|
Klabautermann
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Fr 14.02.03 16:52
Hallo AndyB,
auch wenn wir jetzt etwas von Thema abweichen, aber dein letztes Posting finde ich sehr interessant.
Wenn ich das richtig verstehe, kann man so einen eigenen Demon schreiben.
Hast du dazu weitere Informationen (ein Tutorial)?
Außerdem würde mich interessieren wozu am ende die Endlosschleife:
Quelltext 1: 2: 3:
| repeat Sleep(10); until False; |
dient. Müsste man da nicht noch irgendwelchen Code zum Abarbeiten von Meldungen einfügen oder ähnliches?
Gruß
Klabautermann
|
|
AndyB
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: Fr 14.02.03 16:59
Die Endlosschleife dient nur dazu, dass der Deamon nicht beendet wird. Das Sleep() darin reduziert nur die Systemlast.
Natürlich könnte man in der Schleife die Abarbeitung durchführen, jedoch ist dies bei TIdTCPServer nicht notwendig.
All zu viele Informationen dazu habe ich nicht. Unter Linux einen Service (Deamon) zu schreiben ist nicht so schwer wie es unter Windows der Fall ist.
Um es nicht zu vergessen: Einen Deamon wird mit "# kill pid" beendet, wobei "pid" die ProcessID des Deamon ist.
_________________ Ist Zeit wirklich Geld?
|
|
AndyB
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: Fr 14.02.03 17:07
Noch was zu den Parameter der Funktion deamon:
NoChDir: Integer;
Bei 0 wird das Arbeitsverzeichnis auf / gesetzt. Dieser Parameter sollte immer 0 sein, da ansonsten Probleme mit mount/unmount auftreten können.
NoClose: Integer
Bei 0 wird stdin, stdout, stderr nach /dev/null umgeleitet.
_________________ Ist Zeit wirklich Geld?
Zuletzt bearbeitet von AndyB am Fr 14.02.03 17:25, insgesamt 1-mal bearbeitet
|
|
Klabautermann
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Fr 14.02.03 17:16
Danke,
sehr Spannend.
Gruß
Klabautermann
|
|