![]() |
IdSimpleServer: Wie Daten senden?
Kann mir einer von euch erklären, wie ich die Komponente TIdSimpleServer mit einer TIdTCPClient Komponente nutzen kann?
Ich kann zwar connecten, aber keine Daten senden... |
Re: IdSimpleServer: Wie Daten senden?
Ich hab' Indy im Moment nicht auf dem Rechner, aber kuck mal, ob es ein Write***() in der Komponente gibt. Wenn es nicht DIREKT in der Komponente verbaut ist, sollte es unter Connection.Write***() sein.
|
Re: IdSimpleServer: Wie Daten senden?
Delphi-Quellcode:
Dieses ist mein Programm.
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls, IdTCPClient, IdBaseComponent, IdComponent, IdTCPConnection, IdSimpleServer; type TForm1 = class(TForm) IdSimpleServer1: TIdSimpleServer; IdTCPClient1: TIdTCPClient; Button1: TButton; ProgressBar1: TProgressBar; CheckBox1: TCheckBox; Edit1: TEdit; Button2: TButton; procedure Button1Click(Sender: TObject); procedure CheckBox1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure IdSimpleServer1Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer); procedure IdSimpleServer1WorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer); procedure IdSimpleServer1Status(ASender: TObject; const AStatus: TIdStatus; const AStatusText: String); procedure IdSimpleServer1Disconnected(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin if IdTCPClient1.Connected then begin IdTCPClient1.Disconnect; Button1.Caption := '0'; end else begin IdTCPClient1.Connect(2500); if IdTCPClient1.Connected then Button1.Caption := '1' else Button1.Caption := '0'; end; end; procedure TForm1.CheckBox1Click(Sender: TObject); begin if CheckBox1.Checked then IdSimpleServer1.Listen else IdSimpleServer1.EndListen; end; procedure TForm1.Button2Click(Sender: TObject); begin if IdTCPClient1.Connected then IdTCPClient1.WriteLn(Edit1.Text); end; procedure TForm1.IdSimpleServer1Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer); begin Caption := IdSimpleServer1.ReadLn(#$A, 2500); end; procedure TForm1.IdSimpleServer1WorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer); var i : Integer; begin i := 0; end; procedure TForm1.IdSimpleServer1Status(ASender: TObject; const AStatus: TIdStatus; const AStatusText: String); var i : Integer; begin i := 0; end; procedure TForm1.IdSimpleServer1Disconnected(Sender: TObject); begin IdSimpleServer1.EndListen; CheckBox1.Checked := false; end; end. Es beinhaltet sowohl einen SimpleServer als auch ein TIdTCPClient. Ziel ist es, einem kleinen, ICQ-ähnlichem Programm die Möglichkeit zu geben, Dateien zu versenden. Leider reagiert der IdSimpleServer weder auf das OnStatus Ereignis, noch auf OnWork, OnWorkBegin oder OnWorkEnd. Daher kann der Server nicht erkennen, ob ein Client connected ist und Daten sendet. Vielleicht kann mir jemand helfen... |
Re: IdSimpleServer: Wie Daten senden?
In diesem Fall solltest du keinen IdSimpleServer benutzen, sondern die TIdTCPClient.WriteFile() - FUnktion nutzen. DIese FUnktion öffnet eine Datei auf einem Datenträger und versendet sie binär an den Server, der kann das ganze dann verarbeiten/weiterleiten/etc.
|
Re: IdSimpleServer: Wie Daten senden?
nur was nutzt es mir, wenn ich beim der Server-Komponente keine Möglichkeit habe zu überprüfen, ob der Client gerade was sendet?
Ich muss ja schliesslich der Server-Komponente sagen, wo er die Datei dann abspeichern soll... |
Re: IdSimpleServer: Wie Daten senden?
Sende dem Server doch verher sowas:
Code:
Das "response" ist bewusst angefügt, damit man dem Server mitteilt, ob er erst bestätigen soll, das er die Datei erhalten kann.
/getfile saveat:C:\my.file response:no endresponse:yes
Das "endresponse" ist dafür gedacht, dem Client zu sagen "Datei ist angekommen". |
Re: IdSimpleServer: Wie Daten senden?
Ich habe mich wohl etwas unglücklich ausgedrückt.
Welche Events des IdSimpleServers werden ausgelöst, wenn ich folgende Tätigkeiten mit dem Client ausführe: 1. IdTCPClient.Connect 2. IdTCPClient.WriteLn 3. IdTCPClient.WriteFile 4. IdTCPClient.Disconnect In allen 4 Fällen reagieren leider weder: IdSimpleServer.OnStatus IdSimpleServer.OnWork IdSimpleServer.OnWorkBegin IdSimpleServer.OnWorkEnd IdSimpleServer.OnDisconnect (und das sind alle Events des SimpleServers) Ich habe also keine Möglichkeit auf irgendeine Aktion des IdTCPCLients zu reagieren... |
Re: IdSimpleServer: Wie Daten senden?
Doch: bei OnStatus checkst du, ob ein Kommando (wie das von mir) vorliegt, um es entsprechend zu verarbeiten.
|
Re: IdSimpleServer: Wie Daten senden?
ich habe folgendes beim OnStatus-Event stehen:
Delphi-Quellcode:
und bei i:=0 einen Breakpunkt (Optimierung des Kompiliers ist ausgeschaltet).
procedure TForm1.IdSimpleServer1Status(ASender: TObject;
const AStatus: TIdStatus; const AStatusText: String); var i : Integer; begin i := 0; end; Doch leider bleibt das Programm nicht stehen, wenn ich mit einem CLient connecte.... Und das sollte es doch eigentlich, wenn das OnStatus-Event ausgelöst wird, oder? |
Re: IdSimpleServer: Wie Daten senden?
Du kannst stattdessen schreiben:
Delphi-Quellcode:
Dann würde das gehen.
i := Length(AStatusMessage);
height := height - i; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:27 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